最近在寫一個小程序,然后里面自己寫了個URL的處理器,比如說訪問index.php/article 那么就會自動加載進來article頁面,訪問index.php/home就會自動加載home頁面。
在Apache服務器中使用了 $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] 獲取完整的URL地址並且對地址進行解析是成功的,因為在Apache中訪問
index.php/article會被解析成訪問index.php這個文件,但是在Nginx中這樣訪問的話就會出現404錯誤,頁面未找到。

這是什么原因造成的呢?
在Apache中, 當不加配置的時候, 對於PHP腳本, AcceptPathInfo是默認接受的, 也就是說:
如果在服務器在存在一個/iwenku/index.php/
那么, 對於如下請求,
- 127.0.0.1/iwenku/index.php/article/
- 127.0.0.1/iwenku/article/
Apache都接受, 都會認為是對index.php的訪問, 並會設置PATH_INFO為article
而對於Nginx下, 是不支持PATH INFO的, 也就是它不會默認設置PATH_INFO.
而因為默認的配置文件對PHP的支持只是很基礎的, 所以對於默認配置來說對於上面的訪問也會是404, 提示找不到文件出錯.
對這個問題的解決方案便是修改Nginx的配置文件,模擬PATH_INFO:
首先 , 我們知道在Nginx中, 是通過對文件名的擴展名匹配, 來決定是否要交給php cgi服務器去解釋的. 在nginx.conf中一般都有如下的默認配置段:
location ~ .php$ { //$代表結尾,這樣對於后面跟隨內容的URL地址就不會進行解析 fastcgi_index index.php; fastcgi_pass 127.0.0.1:9000; include fastcgi_params; }
所以,對於形如/iwenku/index.php/article/這樣的文件路徑, Nginx是不會正確的交給php cgi服務器的. 所以我們需要改寫這段配置為:
location ~ .php {//只要含有.php那么就進行解析
fastcgi_index index.php;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
}
現在, 腳本路徑已經交由PHP自己處理了. 那怎么增加PATH_INFO呢?
首先需要設置PHP中的cgi.fixcgi.fix_pathinfo=1(這個需要在php.ini文件中配置,如果沒有需要自己添加)
打開這個配置項以后, PHP會去根據CGI規范來檢查SCRIPT_FILENAME中那部分是訪問腳本和PATH_INFO, 並根據SCRIPT_NAME來修改PATH_INFO(和PATH_TRANSLATED)為正確的值
然后需要更改nginx.conf文件的配置
location ~ .php {
root "E:\www\wwwroot";
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
#pathinfo support
set $real_script_name $fastcgi_script_name;
set $path_info ””;
if ( $fastcgi_script_name ~ "^(.+?.php)(/.+)$"){
set $real_script_name $1;
set $path_info $2;
}
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}
