要想讓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以上版本)
例如<?php print_r(pathinfo("/nginx/test.txt"));
?>
輸出array
( [dirname] => /nginx
[basename] => test.txt
[extension] => txwww.cppcns.comt
[filename] => test
)php中的$_server['path_info']
php中的全域性變數$_server['path_info'],path_info是乙個cgi 1.1的標準,經常用來做為傳參載體。
被很多系統用來優化url路徑格式,最著名的如thinkphp框架。
對於下面這個**:
我們可以得到 $_server['path_info'] = '/test/my.html',而此時 $_server['query_string'] = 'c=index&m=search';
如果不借助高階方法,php中 這樣的url很常見,大多數人可能會覺得不太美觀而且對於搜尋引擎也是非常不友好的(實際上有沒有影響未知),因為現在的搜尋引擎已經很智慧型了,可以收入帶引數的字尾網頁,不過大家出於整潔的考慮還是想希望能夠重寫url,
下面是一段解析利用path_info的進行重寫的非常簡單的**:
<?php if(!isset($_server['path_info'])) else
if(is_array($pathinfo) && !empty($pathinfo)) else
?>
有了以上認識我們就可以介入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 /
}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($|/)
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;
}新版本的nginwzvbvqaynex也可以使用fastcgi_split_path_info指令來設定path_info,舊的方式不再推薦使用,在location段新增如下配置。
location ~ ^.+\.php
最後可能有人要問為什麼apache不會出現這個問題?
apache一般是以模組的方式執行php,apache可以對$_server['path_info']的值進行設定,不需要另外配置。
本文標題: nginx下支援path_info的方法例項詳解
本文位址: /jiqiao/fuwuqi/141751.html
在centos 下,php 開啟pathinfo
1 檢視是否開啟了 curl 和pathinfo函式 在 根目錄下,寫test.php echo phpinfo img img 2 如果pathinfo 的local value 和 master value 為0的話,那麼開啟方法如下 1 shell 連上伺服器,查詢 php.ini 檔案 fi...
Linux系統下Nginx支援ipv6
需要執行以下命令,檢視現有nginx是否支援ipv6,如果引數中具有 with ipv6,則支援,如 果沒有,則不支援,需要重新編譯nginx。此處的nginx路徑以您實際的nginx啟動檔案路徑為準 usr local nginx 1.14.0 sbin nginx v解壓nginx的安裝包 進入...
nginx支援動態模組
之前一直以為nginx只支援靜態模組,每次新增新模組的時候只能重新編譯,最近在看nginx的原始碼,發現新版nginx已經支援進行動態載入模組。通過模組動態載入指令load module,我們可以在執行中修改nginx的配置,指定要載入的第三方模組,然後reload,是不是方便了很多。core模組已...