续:让nginx支持pathinfo

续上一篇《让nginx支持pathinfo

原文的配置在我本机(Win,Nginx1.2.4)还算可以,但是有一个bug,就是如果url里面包含trailing slash(最后的斜杠/)的话,PATH_INFO捕捉到的值有误,为ATH_INFO,同时$_SERVER数组里面多了一个键名为ORIG_PATH_INFO的元素其值为我们期望的path_info,非常怪异,一开始以为是$path_info变量未定义的问题,$p不见了,剩下ath_info,后面改过变量名之后还是不行,证明不是这个问题。

同样的配置搬到服务器上面用(CentOS6,Nginx1.0.10)完全行不通,根据官方指引(PHPFcgi Common ErrorsNginx Pitfalls)排查无果,再在网上找了许许多多的方案来来回回测试了好几十遍,还是很有问题,而且官方指引(try_files)里面明确指出那种检查文件之后rewrite的方法是terrible的,应该使用try_files代替。

折腾了很久之后还是有各种问题,其实很多PHP框架(如Yii、CI、ThinkPHP)、流行的应用系统(Wordpress、Joomla)等都支持另外一种兼容模式的pathinfo,就是通过其他方法获取path_info值,大部分都通过服务器配置把$request_uri转换为一个queryString参数后转发给index.php,个人目前认为这个方式不太好因为会污染get参数,要注意不要使用保留的get键名,但是如果外部直接在url里面指定该参数不知道会发生什么事。

既然是从$request_uri里面来的,那么直接从$_SERVER[‘REQUEST_URI’]里面提取path_info好了,下面是服务器上面的配置。

location / {
    try_files $uri $uri/ /index.php;
}
location ~ ^.+.php($|/) {
    #fastcgi_split_path_info ^((?U).+.php)(.*)$;
    include fcgi.conf;
    fastcgi_param  PATH_INFO          $fastcgi_path_info;
    fastcgi_param  PATH_TRANSLATED    $document_root$fastcgi_path_info;
    #fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
    fastcgi_pass unix:/tmp/php-cgi.sock;
    fastcgi_index index.php;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注