nginx下支援PATH_INFO的方法

來源:互聯網
上載者:User
這篇文章主要介紹了nginx下支援PATH_INFO的方法,結合執行個體形式詳細分析了nginx下使用PATH_INFO模式的具體方法與相關提示,需要的朋友可以參考下

本文執行個體分析了nginx下支援PATH_INFO的方法。分享給大家供大家參考,具體如下:

要想讓nginx支援PATH_INFO,首先需要知道什麼是pathinfo,為什麼要用pathinfo?

pathinfo不是nginx的功能,pathinfo是php的功能。

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

nginx能做的只是對$_SERVER['PATH_INFO]值的設定。

下面我們舉例說明比較直觀。先說php中兩種pathinfo的作用,再說如何讓nginx支援pathinfo。

php中的兩個pathinfo

php中的pathinfo()

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

[dirname] 路徑的目錄
[basename] 帶尾碼 檔案名稱
[extension] 檔案尾碼
[filename] 不帶尾碼檔案名稱(需php5.2以上版本)

例如

<?phpprint_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';

如果不藉助進階方法,php中http://www.test.com/index.php?type=search 這樣的URL很常見,大多數人可能會覺得不太美觀而且對於搜尋引擎也是非常不友好的(實際上有沒有影響未知),因為現在的搜尋引擎已經很智能了,可以收入帶參數的尾碼網頁,不過大家出於整潔的考慮還是想希望能夠重寫URL,

下面是一段解析利用PATH_INFO的進行重寫的非常簡單的代碼:

<?phpif(!isset($_SERVER['PATH_INFO'])) {  $pathinfo = 'default';} else {  $pathinfo = explode('/', $_SERVER['PATH_INFO']);}if(is_array($pathinfo) && !empty($pathinfo)) {  $page = $pathinfo[1];} else {  $page = 'default.php';}?>

有了以上認識我們就可以介入nginx對$_SERVER['PATH_INFO']支援的問題了。在這之前還要介紹一個php.ini中的配置參數cgi.fix_pathinfo,它是用來對設定cgi模式下為php是否提供絕對路徑資訊或PATH_INFO資訊。沒有這個參數之前PHP設定絕對路徑PATH_TRANSLATED的值為SCRIPT_FILENAME,沒有PATH_INFO值。設定這個參數為cgi.fix_pathinfo=1後,cgi設定完整的路徑資訊PATH_TRANSLATED的值為SCRIPT_FILENAME,並且設定PATH_INFO資訊;如果設為cgi.fix_pathinfo=0則只設定絕對路徑PATH_TRANSLATED的值為SCRIPT_FILENAME。cgi.fix_pathinfo的預設值是1。

nginx預設是不會設定PATH_INFO環境變數的的值,需要php使用cgi.fix_pathinfo=1來完成路徑資訊的擷取,但同時會帶來安全隱患,需要把cgi.fix_pathinfo=0設定為0,這樣php就擷取不到PATH_INFO資訊,那些依賴PATH_INFO進行URL美化的程式就失效了。

1.可以通過rewrite方式代替php中的PATH_INFO

執行個體:thinkphp的pathinfo解決方案

設定URL_MODEL=2

location / {  if (!-e $request_filename){    rewrite ^/(.*)$ /index.php?s=/$1 last;  }}

2.nginx設定檔中設定PATH_INFO值

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

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

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

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;}

新版本的nginx也可以使用fastcgi_split_path_info指令來設定PATH_INFO,舊的方式不再推薦使用,在location段添加如下配置。

location ~ ^.+\.php { (...) fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME /path/to/php$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; (...)}

最後可能有人要問為什麼apache不會出現這個問題?

apache一般是以模組的方式運行php,apache可以對$_SERVER['PATH_INFO']的值進行設定,不需要另外配置。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.