Nginx try_files & PHP PATH_INFO

try_files $uri $uri/ /index.php?$query_string;

这句的话得意思是依次找 文件,找目录,找index.php 在找的过程中,如果存在就执行并不往后面找了。这个是 Nginx 语法,可以到 http://nginx.org 官网上查阅相关文档。

我遇到的问题是,在 Laravel 文档中说,为了使用 PATH_INFO 需要加上这句话。这句话很早我就看见了,可是一直不明白为什么要加这句话?不应该是加 PATH_INFO 相关的吗?

直到今天,我在本地安装使用 Typecho 这款程序,调式的时候发现如下(已在 Nginx 上面中配置了 try_files 语句,及 Typecho 后台已开启 永久链接-》地址重写功能):
访问URL:http://www.typecho.test/archives/1.html 没报错,能够正常访问,这里并没有设置 PATH_INFO 重写,为什么还能访问?于是我在 index.php 第一行写死 var_dump($_SERVER);exit; 再次访问看看,经过反复测试,PATH_INFO 上是空字符串,而唯一有变化的是 REQUEST_URI 。
我差不多明白了,可能就像 ThinkPHP 那样,有一个优先级,如果 PATH_INFO 为空,继而拿 REQUEST_URI 去匹配路由(用这个方法可以解决,有些服务器不支持 PATH_INFO 模式,且只需要代码上简单兼容一下就好了,太好了)。

访问URL:/abc?q=1
try_files /index.php?/abc?q=1
为什么 REQUEST_URI 确是 /abc?q=1 而 QUERY_string 是 q=1,可能 cgi 是这样执行的,但 Nginx 或者 cgi 拿的是当前URL的信息,也就覆盖掉了,我想可能是这样的,我不确定。

添加新评论