linux nginx 下支持PATH_INFO模式具體配置


本人小白對於服務器一直心存畏懼不敢輕易嘗試,但是有的時候被逼無奈只能是硬着頭皮網上沖,以下僅代表自己的看法,不喜勿噴!!!

pathinfo 本身並不屬於nginx的功能,pathinfo是php的功能

php中有兩個pathinfo,一個是環境變量$_SERVER['PATH_INFO'];另一個是pathinfo函數,pathinfo() 函數以數組的形式返回文件路徑的信息;。

在nginx的使用中是能是使用環境變量$_SERVER['PATH_INFO'],通過對環境變量的設置從而實現我們的需求

php中的兩個pathinfo

php中的pathinfo()

pathinfo()函數可以對輸入的路徑進行判斷,以數組的形式返回文件路徑的信息,數組包含以下元素。

[dirname]  路徑的目錄
[basename] 帶后綴 文件名
[extension]  文件后綴
[filename]  不帶后綴文件名(需php5.2以上版本)

例如

<?php
print_r( pathinfo ( "/nginx/test.txt" ));
?>
輸出
Array
(
   [dirname] => /nginx
   [ basename ] => test.txt
   [extension] => txt
   [filename] => test
)

php中的$_SERVER['PATH_INFO']

PHP中的全局變量$_SERVER['PATH_INFO'],PATH_INFO是一個CGI 1.1的標准,經常用來做為傳參載體。

被很多系統用來優化url路徑格式,最著名的如THINKPHP框架。

對於下面這個網址:

http://www.test.cn/index.php/test/my.html?c=index&m=search

我們可以得到 $_SERVER['PATH_INFO'] = '/test/my.html',而此時 $_SERVER['QUERY_STRING'] = 'c=index&m=search';

3.nginx配置文件中設置PATH_INFO值

請求的網址是/abc/index.php/abc

PATH_INFO的值是/abc
SCRIPT_FILENAME的值是$doucment_root/abc/index.php
SCRIPT_NAME /abc/index.php

nginx默認是不會設置PATH_INFO環境變量的的值,需要php使用cgi.fix_pathinfo=1來完成路徑信息的獲取,但同時會帶來安全隱患,需要把cgi.fix_pathinfo=0設置為0,這樣php就獲取不到PATH_INFO信息,那些依賴PATH_INFO進行URL美化的程序就失效了。

以上內容均為百度中搜索得到,雖然我遇到的問題是各位前輩已經遇到過得但是不同的服務器配置問題還是不一樣的,我的服務器配置是LNMP但是是直接通過阿里雲的鏡像市場安裝的,在我的php.ini中cgi.fix_pathinfo=1默認值是0但是在百度上搜索好多帖子需要把它設置成1我緊隨其后,但是同樣的更改后我的服務器反而出現了更大的問題,我點擊鏈接,刷新頁面都變成了下載,這時候我意識到了問題的嚴重性,為什么會變成下載呢,忽然間想起自己更改的值,然后馬上將其改為原來的值0然后重新配置nginx重新啟動,這時候nginx安然支持path_info

下面張貼nginx的配置

        1. 添加的代碼如下:

          location / {        

              if (!-e $request_filename) {

                  rewrite  ^/(.*)$  /index.php/$1  last;

                          break;

                  }

          }

           

          location ~ \.php {

              fastcgi_pass 127.0.0.1:9000;  //注意自己的ip和端口號

              fastcgi_index index.php;

              include fcgi.conf;               //注意自己nginx中調用的文件

              set $real_script_name $fastcgi_script_name;

              if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {

                  set $real_script_name $1;

                  set $path_info $2;

              }

              fastcgi_param SCRIPT_FILENAME $document_root$real_script_name;

              fastcgi_param SCRIPT_NAME $real_script_name;

              fastcgi_param PATH_INFO $path_info;

          }

          更改完之后記得重啟

2.nginx配置文件中設置PATH_INFO值

請求的網址是/abc/index.php/abc

PATH_INFO的值是/abc
SCRIPT_FILENAME的值是$doucment_root/abc/index.php
SCRIPT_NAME /abc/index.php

舊版本的nginx使用如下方式配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
location ~ .php($|/) {
   set $script $uri ;
   set $path_info "" ;
   if ( $uri ~ "^(.+.php)(/.+)" ) {
     set $script $1 ;
     set $path_info $2 ;
   }
   fastcgi_pass 127.0.0.1:9000;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME $document_root $script ;
   fastcgi_param SCRIPT_NAME $script ;
   fastcgi_param PATH_INFO $path_info ;
}


免責聲明!

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



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