Nginx服務器不支持PATH_INFO的問題及解決辦法


最近在寫一個小程序,然后里面自己寫了個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/

那么, 對於如下請求,

  1. 127.0.0.1/iwenku/index.php/article/
  2. 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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM