续上一篇《让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 Errors、Nginx 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; }