nginx下支持PATH_INFO的方法實(shí)例詳解
本文實(shí)例分析了nginx下支持PATH_INFO的方法。分享給大家供大家參考,具體如下:
要想讓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ò)大家出于整潔的考慮還是想希望能夠重寫(xiě)URL,
下面是一段解析利用PATH_INFO的進(jìn)行重寫(xiě)的非常簡(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'; } ?>
有了以上認(rèn)識(shí)我們就可以介入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è)置,不需要另外配置。
本文永久地址:http://blog.it985.com/7768.html
本文出自 IT985博客 ,轉(zhuǎn)載時(shí)請(qǐng)注明出處及相應(yīng)鏈接。
希望本文所述對(duì)大家nginx服務(wù)器配置有所幫助。
- Symfony2安裝的方法(2種方法)
- Symfony生成二維碼的方法
- Symfony2 session用法實(shí)例分析
- Symfony學(xué)習(xí)十分鐘入門(mén)經(jīng)典教程
- PHP的Symfony和CodeIgniter框架的Nginx重寫(xiě)規(guī)則配置
- Symfony數(shù)據(jù)校驗(yàn)方法實(shí)例分析
- symfony表單與頁(yè)面實(shí)現(xiàn)技巧
- Symfony頁(yè)面的基本創(chuàng)建實(shí)例詳解
- 高性能PHP框架Symfony2經(jīng)典入門(mén)教程
- 如何在symfony中導(dǎo)出為CSV文件中的數(shù)據(jù)
- Symfony2在Nginx下的配置方法圖文教程
相關(guān)文章
在nginx中配置pathinfo模式支持thinkphp的URL重寫(xiě)
這篇文章主要介紹了在nginx中配置pathinfo模式的例子,用來(lái)支持thinkphp的URL重寫(xiě),并解決了thinkphp一個(gè)路徑問(wèn)題,需要的朋友可以參考下2014-04-04分布式架構(gòu)中關(guān)于正向代理反向代理面試提問(wèn)
這篇文章主要為大家介紹了分布式架構(gòu)中關(guān)于正向代理反向代理的面試提問(wèn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03負(fù)載均衡下的webshell上傳+nginx解析漏洞的過(guò)程
這篇文章主要介紹了負(fù)載均衡下的webshell上傳+nginx解析漏洞,首先介紹了負(fù)載均衡下webshell上傳的四大難點(diǎn)及環(huán)境搭建教程,感興趣的朋友跟隨小編一起看看吧2024-02-02nginx實(shí)現(xiàn)動(dòng)靜分離的示例代碼
這篇文章主要介紹了nginx實(shí)現(xiàn)動(dòng)靜分離的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12nginx php-fpm環(huán)境中chroot功能的配置使用方法
這篇文章主要介紹了nginx php-fpm環(huán)境中chroot功能的配置使用方法,此方法是比禁用PHP敏感函數(shù)更好的一個(gè)安全防護(hù)手手段,需要的朋友可以參考下2014-05-05nginx動(dòng)態(tài)添加訪問(wèn)白名單的方法
本篇文章主要介紹了nginx動(dòng)態(tài)添加訪問(wèn)白名單的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-02-02Nginx?403?forbidden錯(cuò)誤的原因以及解決方法
yum安裝nginx,安裝一切正常,但是訪問(wèn)時(shí)報(bào)403 forbidden,下面這篇文章主要給大家介紹了關(guān)于Nginx?403?forbidden錯(cuò)誤的原因以及解決方法,需要的朋友可以參考下2022-08-08