msgbartop
PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
msgbarbottom

13 Nov 09 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, 不妥不妥.


分享到:



Related Posts:

Tags: , ,

46 Responses to “Nginx(PHP/fastcgi)的PATH_INFO问题”

  1. log4geek.cc |

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

  2. ブルガリ 婚約指輪 アフターケア |

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

  3. ロレックス エクスプローラー 値段 docomo |

    ブランド偽物(コピー商品)激安市場

    ━…━…━…━…━…━…━…━…━…━…━…
    ルイ.ヴィトン、シャネル、グッチ、エルメス、クロエ、ブラダ、ブルガリ ドルチェ&ガッバ―ナ、バレンシアガ、ボッテガ.ヴェネタ偽物(コピー商品)のブランドのバッグ、財布の販売、通販。
    ━…━…━…━…━…━…━…━…━…━…━…
    ○各種のブランド偽物(コピー商品)の指輪.ネックレス
    ○各種のブランド偽物(コピー商品)のベルト
    ○各種のブランド偽物(コピー商品)のマフラー
    ○ スタイルが多い、品質がよい、価格が低い!
    ○ S品質 シリアル付きも有り 付属品完備!
    ○必ずご満足頂ける品質の商品のみ販売しております.
    ○ 品質を最大限本物と同等とする為に相応の材質にて製作している為です.
    ○ 絶対に満足して頂ける品のみ皆様にお届け致します.

    人気の売れ筋商品を多数取り揃えております。全て激安特価でご提供.お願いします。
    ロレックス エクスプローラー 値段 docomo http://kopii.net/products/p1/3/3/index.htm

  4. CarlosUnigo |

    hello artrit-kremi.info

  5. GeorgeLalk |

    http://www.asicswomen.top/p-laid-3448.html

  6. actors315 |

    模拟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进行一些额外的扩充,实现一些更复杂的变化。(虽然可能并不那些规范)

  7. Roberthave |

    dug cornmeal repercussive summertime chimbly gluily

  8. Performance Audits |

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

  9. 配置nginx支持thinkphp的path_info模式 | kk |

    [...] 感谢laruence。 [...]

  10. 风雪之隅-鸟哥文章汇总 | 互联网菜鸟 |

    [...] Jul 09 PHP Session的一个警告 13 Nov 09 Nginx(PHP/fastcgi)的PATH_INFO问题 20 Jan 10 Nginx/PHP Fastcgi [...]

  11. domain |

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

  12. lyongde |

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

  13. bobo |

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

  14. bobo |

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

  15. Nginx解决不能使用PATH_INFO的问题 » 李楠的个人空间 |

    [...] 通过该文章的方法,修改后发现还是不行。 [...]

  16. Anonymous |

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

  17. Nginx&Apache的PATH_INFO问题 | 平衡点 |

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

  18. CentOS记录操作记录(1)&ci在nginx的404 - 蝎紫の个人博客 |

    [...] 程序源代码是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; } [...]

  19. Nginx(PHP/fastcgi)的PATH_INFO问题 » ijser |

    [...] 本文地址: http://www.laruence.com/2009/11/13/1138.html [...]

  20. xiatian |

    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;

  21. cute |

    http://wiki.nginx.org/HttpFcgiModule#.24fastcgi_script_name
    fastcgi_split_path_info

  22. Channel Magnets |

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

  23. 进口泵 |

    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倍。进口水泵这意味着一个日产万吨级的反渗透海水淡化装置,进口泵如采用两台国产高压泵运行。

  24. 金属管转子流量 |

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

  25. 竹纤维家纺 |

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

  26. 气动隔膜泵 |

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

  27. 纽约旅游租车 |

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

  28. 网站推广 |

    power cord网站利用半年时间采用了如下网站推广策略: URL优化。

    美容网站不断优化URL,提高URL与推广内容的关联性。护肤例如

    搜索“塑料产品”,在搜索页的URL中包含了关键词和搜索条件。 热敏

    电阻中小企业特别需要有诚意、有能力帮助Louis Vuitton中小

    企业成长的专业人士长期深入到企业中识别挑战、离心泵

    义问题、Replica Louis Vuitton剖析原因、万能试验机提出策略和解决方案.

  29. Guaranteed SEO |

    Guaranteed SEO runs a good Guaranteed google rank in the
    google.It is made of Guaranteed SEO company.Use the guaranteed SEO
    give the customers the guaranteed results whatever you want to search.Customers can put different sort of products in the guaranteed SEO.
    Customers can find their products in the Guaranteed google results.Guaranteed SEO has a eximious service
    team for every customer to the Guaranteed google position to show their products.

  30. Trail's Blog » Nginx(PHP/fastcgi)的PATH_INFO问题 |

    [...] 本文地址: http://www.laruence.com/2009/11/13/1138.html [...]

  31. nginx文件类型错误解析漏洞 – kindle's blog |

    [...] http://www.laruence.com/2009/11/13/1138.html Posted on 2010-05-21 at 3:05 下午 | Filed: 网络文摘 | Entry RSS 2.0 feed | Leave a [...]

  32. nginx真的存在文件类型解析漏洞吗? « 每日IT新闻,最新IT资讯,聚合多站点消息,保证你与世界同步 |

    [...] http://www.laruence.com/2009/11/13/1138.html, [...]

  33. PHP中的PATH_INFO | 鸭嘴的blog |

    [...] Nginx(PHP/fastcgi)的PATH_INFO问题 [...]

  34. LORIHerrera23 |

    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

  35. xinqiyang |

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

  36. Nginx/PHP Fastcgi PATH_INFO的一个问题 | 风雪之隅 |

    [...] 通过在nginx.conf中模拟PATH_INFO的方法会有一个bug. 那就是PATH_INFO不会被urldecode. [...]

  37. Torr |

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

  38. 雪候鸟 |

    @zwws con~~ ;)

  39. zwws |

    解决了.

    http://www.zvv.cn/blog/show-110-1.html

  40. zwws |

    有空的话帮忙瞅瞅, thanks. :)

  41. zwws |

    反复折腾了三次到现在, 结果依旧如下:

    访问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

  42. 雪候鸟 |

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

  43. zwws |

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

  44. zwws |

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

  45. esayr |

    得到的结果
    /p.php/index.php

    是正常的.相当于一个文件夹.

    文章转载请求.:)

  46. zwws |

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

Leave a Reply

*