最近一个项目中使用了ThinkPHP做为开发框架,URL上我们使用了PATHINFO模式,但是Nginx默认是不支持PATHINFO的,需要进行手动配置才可以,于是我们按照了以下方法进行了Nginx的PATHINFO支持配置:
修改nginx.conf,找到server中的 location ~ .php${},修改为location ~ .php {},并在其中增加以下内容:
2 | set $real_script_name $fastcgi_script_name; |
3 | if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$" ) { |
4 | set $real_script_name $1; |
7 | fastcgi_param SCRIPT_FILENAME $document_root$real_script_name; |
8 | fastcgi_param SCRIPT_NAME $real_script_name; |
9 | fastcgi_param PATH_INFO $path_info; |
不过无论我们如何测试,都发现PATHINFO模式总是不能正确运行,就算运行后,{:U}方法也总是出错,打印$_SERVER后发现PHP_SELF总是为“/”,因为我们Nginx版本为0.7.54我们开始怀疑是不是版本自身的BUG?于是我将Nginx进行了无缝升级至1.0.12,代码如下:
02 | wget http://nginx.org/download/nginx-1.0.12. tar .gz |
03 | tar -zxvf nginx-1.0.12. tar .gz |
06 | ./configure (上面的configure结果) |
08 | mv opt/nginx /opt/nginx.old |
09 | cp objs/nginx /opt/nginx |
但是依然PATHINFO不能正确正常工作,于是我们确定是ThinkPHP的配置问题,正在我们不知道怎么办时,同事发现其实是ThinkPHP的_PHP_FILE的问题,在入口文件index.php中加入配置define('_PHP_FILE_',$_SERVER['SCRIPT_NAME']);,问题解决。