2019-10-01 13:05:33 2159次浏览 1条回答 0 悬赏 10 金钱

之前一直这样写 nginx 的配置

if (!-e $request_filename){
  rewrite ^/(.*) /index.php?r=$1 last;
}

或者这样写:

location / {
  try_files $uri $uri/ /index.php?r=$uri&$args;
}

以上两种方法差不多,都 很容易理解。

最近 偶然看到权威指南里关于nginx的配置是 这样写的

location / {
  try_files $uri $uri/ /index.php$is_args$args;
}

不禁 产生了 疑惑,这里 只是把参数传给了 index.php 文件,把 uri信息 怎么给 丢掉了?

通过查看 yii2 的源代码发现,yii 在不开启 URL美化的时候是通过 r 参数来获取路由信息的,在开启 URL美化 的时候,yii 并不是通过 参数来获取 路由信息的,而是通过 REQUEST_URI 这个环境变量来获取,而 REQUEST_URI 这个环境变量里 保存的是 原始的 URL信息,并不受 rewrite 或者 try_files 的影响
举例说:
请求的 url 为 /site/view?id=3
try_files 后,也就是 yii 实际得到的 url 为 index.php?id=3
环境变量 REQUEST_URI 内容为 /site/view?id=3

所以,之前 nginx配置的写法 把 r 传给index.php 完全是 多此一举,它根本也不会用。
其实 REQUEST_URI 里也包括的 参数信息,但 yii 是通过 QUERY_STRING 这个环境变量来获取参数的,所以 还是要把 参数 传给 index.php ,假如 yii 通过解析 REQUEST_URI 来获取参数信息的话,那么 try_files 的时候 就可以 连参数都不要了,直接 try_files $uri $uri/ /index.php 这样就行了。

您需要登录后才可以回答。登录 | 立即注册
蓝
副总裁

注册时间:2013-09-13
最后登录:2023-11-24
在线时长:99小时40分
  • 粉丝13
  • 金钱3225
  • 威望500
  • 积分9215

热门问题