nginx下支援PATH INFO的方法例項詳解

2022-10-03 10:09:09 字數 2694 閱讀 1248

要想讓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模組已...