Press "Enter" to skip to content

Nginx(PHP/fastcgi)的PATH_INFO问题

PATH_INFO是一个CGI 1.1的标准,经常用来做为传参载体.
比如, 我们可以使用PATH_INFO来代替Rewrite来实现伪静态页面, 另外不少PHP框架也使用PATH_INFO来作为路由载体.
在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:
如果在服务器在存在一个/laruence/index.php
那么, 对于如下请求,

/laruence/index.php/dummy
/laruence/dummy

Apache都接受, 都会认为是对info.php的访问, 并会设置PATH_INFO为dummy
而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.
而因为默认的配置文件对PHP的支持只是很基础的, 所以对于默认配置来说对于上面的访问也会是404, 提示找不到文件出错.
这对于一些使用PATH_INFO来传递关键信息的PHP框架来说(比如Kohana, Thinkphp), 简直是致命的.
对于这个问题, 一般来说有俩种解决方法, 第一种就是使用rewrite, 但是这个方法的缺点也是很明显的, 需要把PATH_INFO转换成Query String. 此处就不说明这种方法了~
而, 第二种方法就是我今天要提的, 模拟PATH_INFO:
首先 , 我们知道在Nginx中, 是通过对文件名的扩展名匹配, 来决定是否要交给php cgi服务器去解释的. 在nginx.conf中一般都有如下的默认配置段:

location ~ .php$ {
	fastcgi_index  index.php;
	fastcgi_pass   127.0.0.1:9000;
	include        fastcgi_params;
}

所以,对于形如/laruence/info.php/pathinfo这样的文件路径, Nginx是不会正确的交给php cgi服务器的. 所以我们需要改写这段配置为:

	location ~ .php {//片段匹配
	fastcgi_index  index.php;
	fastcgi_pass   127.0.0.1:9000;
	include        fastcgi_params;
}

现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?
首先, 我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(ini配置解释), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值(其实也就是说明, PHP最初对CGI 1.1的支持并不到位)
然后, 就只要添加一个FASTCGI_PARAM项就好了:

location ~ .php {
	fastcgi_index  index.php;
	fastcgi_pass   127.0.0.1:9000;
	include        fastcgi_params;
	fastcgi_param  PATH_INFO $fastcgi_script_name;
}

现在试试吧...
btw: 当然, 上面的解决方法, 把对路径的分析交给了PHP去处理, 网上也有朋友给出了另外一种配置方法, 这个方法是由Nginx来分析路径(也就不需要fix_pathinfo):

location ~ \.php
{
	fastcgi_index index.php;
	fastcgi_pass 127.0.0.1:9000;
	include      fastcgi_params;
	set $path_info "";
	set $real_script_name $fastcgi_script_name;
	if ($fastcgi_script_name ~ "^(.+?\.php)(/.+)$") {
	set $real_script_name $1;
	set $path_info $2;
}
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_name;
fastcgi_param SCRIPT_NAME $real_script_name;
fastcgi_param PATH_INFO $path_info;
}

后记, 最近发现的一个安全漏洞(Nginx + PHP CGI的一个可能的安全漏洞)和这个配置有关系, 请大家务必在使用第二种配置的时候,关闭cgi.fix_pathinfo. 另外关于这个漏洞我个人认为这个和Nginx没啥关系, 不属于Nginx的漏洞. 是配置的问题, 现在到处都在说是Nginx的Bug, 不妥不妥.

56 Comments

  1. 小白
    小白 December 23, 2019

    你好,刚阅读您的文章,有个地方不太懂。为什么第一种需要在php.ini配置fix_pathinfo而第二种不需要?

  2. […] /With 0 Comments php 在默认的nginx 下 无法获取到$_SERVER 无法获取到path_info; 针对此问题 修改php.ini中cgi.fix_pathinfo=1 nginx 添加配置   fastcgi_param PATH_INFO $fastcgi_script_name; 重启后 再测试$_SERVER 中即可获取path_info; 参考:http://www.laruence.com/2009/11/13/1138.html […]

  3. What i do not realize is if truth be told how you’re not actually a lot
    more smartly-liked than you might bee now. You’re very intelligent.
    You allready know therefore considerably relating to this topic, produced me in my opinion imagine it from
    sso many various angles. Its like men and women don’t
    sem to be interested unless it is something to do with Lady gaga!
    Your own stuffs great. All the time deal woth it
    up! http://www.sports-instyle.com

  4. log4geek.cc
    log4geek.cc February 25, 2017

    我建了个技术交流群,欢迎鸟哥的各位粉丝加入,高级PHP技术交流群 11153486
    欢迎各位PHP同道中人加入交流技术。

  5. 主な取り扱い商品:スーパーコピー時計
    主な取り扱いブランド:
    ロレックススーパーコピー,パネライスーパーコピー,ウブロスーパーコピー,
    ブライトリングスーパーコピー,IWCスーパーコピー,フランクミュラースーパーコピー,
    カルティエスーパーコピー,ベル&ロススーパーコピー,オメガスーパーコピー,ショパールスーパーコピー,
    フェラーリスーパーコピー,グラハムスーパーコピー,ハリー ウィンストンスーパーコピー,アランシルベスタインスーパーコピー,
    ポルシェスーパーコピー,ドゥ・ヴィットスーパーコピー,ポールピコスーパーコピー,
    ボーム&メルシエスーパーコピー,エルメススーパーコピー,コルムスーパーコピー,パテックフィリップスーパーコピー,
    ヴァシュロンコンスタンタンスーパーコピー,モンブランスーパーコピー,オーデマピゲスーパーコピー,ブルカリスーパーコピー品を扱っております。
    他にも各種ブランドのスーパーコピー品多数、取り扱っております。
    弊店は低価格で品質のいい商品をお客様にご提供いたします。
    弊店では信用第一主義を徹底しており社員全員下記の方針のもとに頑張っています。
    1.不適合品を入荷しない。
    厳しく受け入れ検査を行い、お客様に満足いただける品質のいい物だけを入荷する。
    2.不適合品を出荷しない。
    出荷前に細部まで二重確認を行い、お客様からご注文頂いた商品を納期通り出荷する。
    3.お客様からのクレームゼロ
    お客様第一主義を徹底し、お客様からのお問い合わせ、苦情等に対して積極的かつ丁寧に対応いたします。
    ブルガリ 婚約指輪 アフターケア http://www.bagshop78.com/brandcopy-m-33.html

  6. ブランド偽物(コピー商品)激安市場
    ━…━…━…━…━…━…━…━…━…━…━…
    ルイ.ヴィトン、シャネル、グッチ、エルメス、クロエ、ブラダ、ブルガリ ドルチェ&ガッバ―ナ、バレンシアガ、ボッテガ.ヴェネタ偽物(コピー商品)のブランドのバッグ、財布の販売、通販。
    ━…━…━…━…━…━…━…━…━…━…━…
    ○各種のブランド偽物(コピー商品)の指輪.ネックレス
    ○各種のブランド偽物(コピー商品)のベルト
    ○各種のブランド偽物(コピー商品)のマフラー
    ○ スタイルが多い、品質がよい、価格が低い!
    ○ S品質 シリアル付きも有り 付属品完備!
    ○必ずご満足頂ける品質の商品のみ販売しております.
    ○ 品質を最大限本物と同等とする為に相応の材質にて製作している為です.
    ○ 絶対に満足して頂ける品のみ皆様にお届け致します.
    人気の売れ筋商品を多数取り揃えております。全て激安特価でご提供.お願いします。
    ロレックス エクスプローラー 値段 docomo http://kopii.net/products/p1/3/3/index.htm

  7. actors315
    actors315 September 6, 2016

    模拟path_info功能很实用
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    set $path_info $fastcgi_path_info;
    if ($fastcgi_path_info !~* “^/test/(.*)”) {
    set $temp_path_info “/test”;
    set $path_info $temp_path_info$fastcgi_path_info;
    }
    fastcgi_param PATH_INFO $path_info;
    因为本身就是模拟,所以可以对uri进行一些额外的扩充,实现一些更复杂的变化。(虽然可能并不那些规范)

  8. Roberthave
    Roberthave June 3, 2016

    dug cornmeal repercussive summertime chimbly gluily

  9. Performance Audits
    Performance Audits May 28, 2015

    I think the adsmin of this web pagge is in fact working hard for his website, as herfe every data is qualoity
    base material.

  10. domain
    domain August 30, 2014

    Hello, this weekend is good designed for me, as this point in time i am reading this enormous informative paragraph here
    at my residence.

  11. lyongde
    lyongde October 8, 2013

    按照上面思路,问题没解决哎。

  12. bobo
    bobo September 18, 2013

    在网上还看到另一种方案:
    fastcgi_split_path_info ^(.+\.php)(/.+)$;

  13. bobo
    bobo September 18, 2013

    看鸟哥一篇文章10分钟,顶我自己在网上瞎找搞了半天时间

  14. Anonymous
    Anonymous July 26, 2013

    Whats up! I just would like to give a huge thumbs up for the
    good data you

  15. […] Nov 09 Nginx(PHP/fastcgi)的PATH_INFO问题 作者: Laruence 本文地址:Nginx(PHP/fastcgi)的PATH_INFO问题 转载请注明出处 PATH_INFO是一个CGI […]

  16. […] 程序源代码是CI框架的…然后被无情的打击了…基本上链接都是404,主要问题就是Nginx(PHP/fastcgi)的PATH_INFO问题然后各种搜索,终于找到解决方案… location ~ .*.php($|/) {     root /home/wwwroot; #修改为项目对应的根目录     fastcgi_param SCRIPT_FILENAME /home/wwwroot$fastcgi_script_name;     fastcgi_split_path_info ^(.+.php)(.*)$;     fastcgi_param PATH_INFO $fastcgi_path_info;     include fastcgi_params;     fastcgi_pass unix:/tmp/php-fcgi.sock;     fastcgi_index index.php; } […]

  17. xiatian
    xiatian November 17, 2011

    location ~ .php {//片段匹配
    光这样配置还是有风险,如果网站允许上传文件的话(比如图片),用户上传一个muma.php.jpg,该jpg文件内容为一个php木马,然后请求这个路径,如果php可以解析该目录里的文件的话,nginx会把它交给php解析执行,那木马就可以运行了,虽然有很多如果,但不注意可能性还很大.
    对于框架来说好办,框架只访问index.php,所以只要nginx将php首页交给php处理.其他的php文件一律返回404好了.
    nginx还新增了一个fastcgi_split_path_info参数用于获取PATH_INFO信息:
    fastcgi_split_path_info ^(/index\.php)(.*)$;
    fastcgi_param PATH_INFO $fastcgi_path_info;

  18. Channel Magnets
    Channel Magnets December 10, 2010

    悬吊Channel Magnets地球仪 眼界超越局限尽在掌握,悬吊磁铁地球仪,仅仅是材质的变化,Sensors Magnets就把地球仪的呆板一扫而空;深灰的金属色,富有时尚触觉。 Other Magnetic Assembly它可以通过磁铁吸附,挂在墙上成为立体的球型壁画,悬吊在天花板上作为装饰,或者只是简单摆放在桌上。美白重要的是,无论何时何地;桃皮绒销量不减 ,寒意日渐袭人,这一季适用于制作成夹克衫、Nike air max、休闲装的面料在市场上销量一直是相当不错,商家忙碌着向工厂下订单、puma shoes做货样、催出货。cheap handbags无论是内销订单,还是外贸订货,护肤桃皮绒在近期的盛泽市场上有其一定的地位,尤其深受东欧地区的客商喜欢。

  19. 进口泵
    进口泵 November 25, 2010

    PS3 power cord Cyber Monday deals 2010 Best Buy Target & More ,power cord the next generation of gaming with Nyko’s Power Cord for PlayStation 3. The power cord fits into any standard wall outlet and works great as a;江苏大学海水淡化装置科研成果国际领先,乳化机国产高压泵样机一次开机成功,进口阀门现场有一台国外进口泵也同时运行,经检测,在相同频率运行时,国产泵流量、均质器压力均高于进口泵,电机电流值低于进口泵,效率约为进口泵的1.11倍。进口水泵这意味着一个日产万吨级的反渗透海水淡化装置,进口泵如采用两台国产高压泵运行。

  20. 金属管转子流量
    金属管转子流量 November 15, 2010

    几种常用金属管转子流量计的基础知识和比较,叶轮、涡轮流量计、活塞或孔板等用以分流流体。PD流量计的精确度较高,是测量粘性液体的几种方法之一。齿轮流量计像PD流量计,涡轮流量计也会产生不可恢复的压力误差,也需要移动部件。 电磁流量计 具有传导性的流体在流经电磁场时,通过测量电压可得到流体的速度;齐齐哈尔市旅游资源十分丰富,波士顿旅游素以生态环境良好,野生动物植物繁多,山水景色秀美,文化古迹奇特,冰雪风光绮丽而著称。纽约购物近年来,我市旅游产业有了长足的发展,cheap handbags已经成为国民经济的重要组成部分。特别是我市是少数民族聚集区域NFL Jerseys,民族地区的历史文化积淀深厚,自然资源超声波清洗机、人文资源独具特色。

  21. 竹纤维家纺
    竹纤维家纺 October 27, 2010

    现代都市生活忙碌而紧张,一个竹纤维家纺温暖的家能带给每个人最放松的休闲时光,如果说 的发展顺应人们热爱健康、
    巴黎诗碧曼注重环保的迫切需求;就是这样的一个品牌,看好 ,源于它 ,其推出的竹纤维品牌家纺产品绝对是符合市场消费需求的产品,深大玉妹符合追求健康时尚产品和生活品味的人们所要求的。2.自动割管机机械设备防寒过冬所需各种油料的储备工作,自动割料机及时更换各类机械发动机的润滑油和防冻液,检查调整蓄电池电解液的比重等;带式过滤机对轨道车等进行彻底检查,严格按照要求做好橡胶带式过滤机制动试验,确保制动性能良好。

  22. 气动隔膜泵
    气动隔膜泵 October 19, 2010

    气动隔膜泵上海博生水泵制造有限公司系ISO9001-2000国际质量管理体系认证企业。磁力泵由原上海长虹工业泵厂联合国内多家同行及引进外资组建而成的合资企业。产品广泛应用于市政建设、农田水利、上海房地产律师火力发电、石油化工、冶金矿山、房产律师消防环保、食品、航运、医药和轻纺等各个领域,HART手操器是中国水泵业协会和压力变送器全国水泵联销体两大组织的成员企业。螺杆泵 水泵博生公司拥有一批专业技术精、上海房产律师管理水平高的复合型人才.

  23. 纽约旅游租车
    纽约旅游租车 September 29, 2010

    纽约旅游租车:你可以享受一下汽车停下来为你让路的待遇。纽约购物这个待遇大家都知道,但是与跟着旅游团鱼贯而行的感受是不同的,纽约机场接送比如你独自一人时,发现让你过路的汽车乃是一重型大卡车(比坦克还重),大力士司机高踞在驾驶室里哀求般地请你先走。纤维球过滤器你在国内患了汽车恐惧症,你大吃一惊:汽车居然停下来,让你先。你不知所措,不敢动,等着它怒按喇叭。饮用水设备对不起,汽车上的喇叭基本上没人用,都生锈了。汽车总是静悄悄地开,总在为它侵扰行人的世界而内疚着似的。司机在等你过街,你太不好意思了,装着并不过路的样子,广东卫星电视等大卡车走掉,才猫着腰飞快溜过。如此几番,过大街就放开胆子了,广东卫星电视安装汽车恐惧症不治而愈。广东安装卫星电视看着排成一条龙的汽车恭候着你,你发现你不是什么过街老鼠,你乃步行之王。

  24. 网站推广
    网站推广 September 28, 2010

    power cord网站利用半年时间采用了如下网站推广策略: URL优化。
    美容
    网站不断优化URL,提高URL与推广内容的关联性。护肤例如
    搜索“塑料产品”,在搜索页的URL中包含了关键词和搜索条件。 热敏
    电阻
    中小企业特别需要有诚意、有能力帮助Louis Vuitton中小
    企业成长的专业人士长期深入到企业中识别挑战、离心泵
    义问题、Replica Louis Vuitton剖析原因、万能试验机提出策略和解决方案.

  25. LORIHerrera23
    LORIHerrera23 April 8, 2010

    I will recommend not to wait until you earn enough money to order different goods! You can get the loan or just small business loan and feel free

  26. xinqiyang
    xinqiyang March 18, 2010

    谢谢博主的分享,问题搞定了,Nginx 群

  27. Torr
    Torr November 17, 2009

    好文章,转载到 deving.cn 了,希望可以和更多的人分享

  28. 雪候鸟
    雪候鸟 November 16, 2009

    @zwws con~~ 😉

  29. zwws
    zwws November 15, 2009

    有空的话帮忙瞅瞅, thanks. 🙂

  30. zwws
    zwws November 15, 2009

    反复折腾了三次到现在, 结果依旧如下:
    访问http://localhost/p.php/
    PATH_INFO 为 /index.php
    PHP_SELF 为 /p.php/index.php
    配置文件和http://localhost/p.php/的phpinfo()截图放在这了:
    http://www.zvv.cn/nginx_conf.rar

  31. 雪候鸟
    雪候鸟 November 14, 2009

    @zwws 我已补充自己判断的配置, 😉

  32. zwws
    zwws November 13, 2009

    @esayr
    大概理解你的意思了, 可是问题是apache下访问/p.php/返回的是/
    难道只能通过程序去”智能”判断么?
    能否通过调整nginx的配置来解决呢?

  33. zwws
    zwws November 13, 2009

    纠正下, 我访问/p.php/
    PATH_INFO是/index.php
    访问/p.php/aa
    PATH_INFO是/aa
    不明白了

  34. esayr
    esayr November 13, 2009

    得到的结果
    /p.php/index.php
    是正常的.相当于一个文件夹.
    文章转载请求.:)

  35. zwws
    zwws November 13, 2009

    按上文修改conf后
    访问/p.php/
    得到的结果是
    /p.php/index.php

Comments are closed.