1. 程式人生 > >Nginx上ThinkPHP的PATHINFO模式支援

Nginx上ThinkPHP的PATHINFO模式支援

最近一個專案中使用了ThinkPHP做為開發框架,URL上我們使用了PATHINFO模式,但是Nginx預設是不支援PATHINFO的,需要進行手動配置才可以,於是我們按照了以下方法進行了Nginx的PATHINFO支援配置:

修改nginx.conf,找到server中的 location ~ .php${},修改為location ~ .php {},並在其中增加以下內容:

1 set $path_info "";
2 set $real_script_name $fastcgi_script_name;
3 if ($fastcgi_script_name ~ 
"^(.+?.php)(/.+)$") {
4 set $real_script_name $1;
5 set $path_info $2;
6 }
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,程式碼如下:

01 cd /usr/download/
02 wget http://nginx.org/download/nginx-1.0.12.tar.gz
03 tar -zxvf nginx-1.0.12.tar.gz
04 cd nginx-1.0.12
05 /opt/nginx -V
06 ./configure (上面的configure結果)
07 make
08 mv opt/nginx /opt/nginx.old
09 cp objs/nginx /opt/nginx
10 make upgrade

但是依然PATHINFO不能正確正常工作,於是我們確定是ThinkPHP的配置問題,正在我們不知道怎麼辦時,同事發現其實是ThinkPHP的_PHP_FILE的問題,在入口檔案index.php中加入配置define('_PHP_FILE_',$_SERVER['SCRIPT_NAME']);,問題解決。