本文實例分析了nginx下支持PATH_INFO的方法。,具體如下:
要想讓nginx支持PATH_INFO,首先需要知道什么是pathinfo,為什么要用pathinfo?
pathinfo不是nginx的功能,pathinfo是php的功能。
php中有兩個pathinfo,一個是環(huán)境變量$_SERVER['PATH_INFO'];另一個是pathinfo函數(shù),pathinfo() 函數(shù)以數(shù)組的形式返回文件路徑的信息;。
nginx能做的只是對$_SERVER['PATH_INFO]值的設(shè)置。
下面我們舉例說明比較直觀。先說php中兩種pathinfo的作用,再說如何讓nginx支持pathinfo。
php中的兩個pathinfo
php中的pathinfo()
pathinfo()函數(shù)可以對輸入的路徑進(jìn)行判斷,以數(shù)組的形式返回文件路徑的信息,數(shù)組包含以下元素。
[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的標(biāo)準(zhǔn),經(jīng)常用來做為傳參載體。
被很多系統(tǒng)用來優(yōu)化url路徑格式,最著名的如THINKPHP框架。
對于下面這個網(wǎng)址:
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很常見,大多數(shù)人可能會覺得不太美觀而且對于搜索引擎也是非常不友好的(實際上有沒有影響未知),因為現(xiàn)在的搜索引擎已經(jīng)很智能了,可以收入帶參數(shù)的后綴網(wǎng)頁,不過大家出于整潔的考慮還是想希望能夠重寫URL,
下面是一段解析利用PATH_INFO的進(jìn)行重寫的非常簡單的代碼:
<?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';}?>有了以上認(rèn)識我們就可以介入nginx對$_SERVER['PATH_INFO']支持的問題了。在這之前還要介紹一個php.ini中的配置參數(shù)cgi.fix_pathinfo,它是用來對設(shè)置cgi模式下為php是否提供絕對路徑信息或PATH_INFO信息。沒有這個參數(shù)之前PHP設(shè)置絕對路徑PATH_TRANSLATED的值為SCRIPT_FILENAME,沒有PATH_INFO值。設(shè)置這個參數(shù)為cgi.fix_pathinfo=1后,cgi設(shè)置完整的路徑信息PATH_TRANSLATED的值為SCRIPT_FILENAME,并且設(shè)置PATH_INFO信息;如果設(shè)為cgi.fix_pathinfo=0則只設(shè)置絕對路徑PATH_TRANSLATED的值為SCRIPT_FILENAME。cgi.fix_pathinfo的默認(rèn)值是1。
新聞熱點
疑難解答
圖片精選