整理的一点东西(原创为www.phpvim.net)

本文探讨了Nginx如何通过fastcgi_param指令将URL参数传递给FastCGI服务器,特别是在处理复杂的URL结构时的行为。文章还讨论了在不同PHP配置下,如cgi.fix_pathinfo设置为1时,PHP-CGI如何解析这些路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

nginx是个 Proxy,它只负责根据用户的配置文件,通过 fastcgi_param 指令将参数忠实地传递给 FastCGI Server,问题在于 FastCGI Server 如何处理 nginx 提供的参数?


比如访问下面这个 URL:

http://www.a.com/foo.jpg/a.php/b.php/c.php



根据上面给出的配置,nginx 传递给 FastCGI 的 SCRIPT_FILENAME 的值为:
/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php

也就是 $_SERVER[‘ORIG_SCRIPT_FILENAME’]。



当 php.ini 中 cgi.fix_pathinfo = 1 时,PHP CGI 以 / 为分隔符号从后向前依次检查如下路径:
/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php/c.php
/home/verdana/public_html/unsafe/foo.jpg/a.php/b.php
/home/verdana/public_html/unsafe/foo.jpg/a.php

/home/verdana/public_html/unsafe/foo.jpg



直到找个某个存在的文件,PHP 会把这个文件当成 cgi 脚本执行,并赋值路径给 CGI 环境变量——SCRIPT_FILENAME,也就是 $_SERVER[‘SCRIPT_FILENAME’] 的值了。


在很多使用 php-fpm (<0.6) 的主机中也会出现这个问题,但新的 php-fpm 的已经关闭了 cgi.fix_pathinfo,如果你查看 phpinfo() 页面会发现这个选项已经不存在了,代码 ini_get("cgi.fix_pathinfo") 的返回值也是 "false"。 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值