溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

nginx下如何支持PATH_INFO

發(fā)布時(shí)間:2021-12-13 09:28:50 來(lái)源:億速云 閱讀:95 作者:小新 欄目:云計(jì)算

這篇文章主要介紹了nginx下如何支持PATH_INFO,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

要想讓nginx支持PATH_INFO,首先需要知道什么是pathinfo,為什么要用pathinfo?
 
pathinfo不是nginx的功能,pathinfo是php的功能。
 
php中有兩個(gè)pathinfo,一個(gè)是環(huán)境變量$_SERVER['PATH_INFO'];另一個(gè)是pathinfo函數(shù),pathinfo() 函數(shù)以數(shù)組的形式返回文件路徑的信息;。
 
nginx能做的只是對(duì)$_SERVER['PATH_INFO]值的設(shè)置。
 
下面我們舉例說(shuō)明比較直觀。先說(shuō)php中兩種pathinfo的作用,再說(shuō)如何讓nginx支持pathinfo。
 
 
php中的兩個(gè)pathinfo
 
php中的pathinfo()
 
pathinfo()函數(shù)可以對(duì)輸入的路徑進(jìn)行判斷,以數(shù)組的形式返回文件路徑的信息,數(shù)組包含以下元素。
 
[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是一個(gè)CGI 1.1的標(biāo)準(zhǔn),經(jīng)常用來(lái)做為傳參載體。
 
被很多系統(tǒng)用來(lái)優(yōu)化url路徑格式,最著名的如THINKPHP框架。
 
對(duì)于下面這個(gè)網(wǎng)址:
 
http://www.test.cn/index.php/test/my.html?c=index&m=search
 
我們可以得到 $_SERVER['PATH_INFO'] = ‘/test/my.html’,而此時(shí) $_SERVER['QUERY_STRING'] = 'c=index&m=search';
 
如果不借助高級(jí)方法,php中http://www.test.com/index.php?type=search 這樣的URL很常見(jiàn),大多數(shù)人可能會(huì)覺(jué)得不太美觀而且對(duì)于搜索引擎也是非常不友好的(實(shí)際上有沒(méi)有影響未知),因?yàn)楝F(xiàn)在的搜索引擎已經(jīng)很智能了,可以收入帶參數(shù)的后綴網(wǎng)頁(yè),不過(guò)大家出于整潔的考慮還是想希望能夠重寫URL,
 
下面是一段解析利用PATH_INFO的進(jìn)行重寫的非常簡(jiǎn)單的代碼:
 
<?php
     if(!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對(duì)$_SERVER['PATH_INFO']支持的問(wèn)題了。在這之前還要介紹一個(gè)php.ini中的配置參數(shù)cgi.fix_pathinfo,它是用來(lái)對(duì)設(shè)置cgi模式下為php是否提供絕對(duì)路徑信息或PATH_INFO信息。沒(méi)有這個(gè)參數(shù)之前PHP設(shè)置絕對(duì)路徑PATH_TRANSLATED的值為SCRIPT_FILENAME,沒(méi)有PATH_INFO值。設(shè)置這個(gè)參數(shù)為cgi.fix_pathinfo=1后,cgi設(shè)置完整的路徑信息PATH_TRANSLATED的值為SCRIPT_FILENAME,并且設(shè)置PATH_INFO信息;如果設(shè)為cgi.fix_pathinfo=0則只設(shè)置絕對(duì)路徑PATH_TRANSLATED的值為SCRIPT_FILENAME。cgi.fix_pathinfo的默認(rèn)值是1。
 
nginx默認(rèn)是不會(huì)設(shè)置PATH_INFO環(huán)境變量的的值,需要php使用cgi.fix_pathinfo=1來(lái)完成路徑信息的獲取,但同時(shí)會(huì)帶來(lái)安全隱患,需要把cgi.fix_pathinfo=0設(shè)置為0,這樣php就獲取不到PATH_INFO信息,那些依賴PATH_INFO進(jìn)行URL美化的程序就失效了。
 
1.可以通過(guò)rewrite方式代替php中的PATH_INFO
 
實(shí)例:thinkphp的pathinfo解決方案
設(shè)置URL_MODEL=2
 
location / {
    if (!-e $request_filename){
        rewrite ^/(.*)$ /index.php?s=/$1 last;
    }
}
 
2.nginx配置文件中設(shè)置PATH_INFO值
請(qǐng)求的網(wǎng)址是/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指令來(lái)設(shè)置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;
  (...)
}
 
 
 
最后可能有人要問(wèn)為什么apache不會(huì)出現(xiàn)這個(gè)問(wèn)題?
 
apache一般是以模塊的方式運(yùn)行php,apache可以對(duì)$_SERVER['PATH_INFO']的值進(jìn)行設(shè)置,不需要另外配置。
 

感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“nginx下如何支持PATH_INFO”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI