如何在nginx环境中启用php的nginx支持pathinfoo URL模式

如何在Nginx上部署ThinkPHP,解决Pathinfo问题 - 吾爱源码
&>&&>&&&&如何在Nginx上部署ThinkPHP,解决Pathinfo问题
如何在Nginx上部署ThinkPHP,解决Pathinfo问题
作者:佚名 来源:吾爱源码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114var&url=system.php?m=Login&a=doL&&&$.post(url,{staffname:$staffname,staffpwd:$staffpwd,verifycode:$verifycode},function(data){&&&&&&&if(data==codeerr){&&&&&&&&&&&&&alert(验证码错误!);&&&&&&&}else&if(data==authempty){&&&&&&&&&&&&&alert(请输入用户名或密码!)&&&&&&&}else&if(data==autherr){&&&&&&&&&&&&&alert(用户名或密码错误!);&&&&&&&}else&if(data==success){&&&&&&&&&&&&&alert(登录成功!);&&&&&&&&&&&&&&location.href=&/&&&br&当然,此为普通模式下的访问方式,如果是pathinfo的话,只需要把红色部分如下修改即可&br&&br&&pre&class=&brush:&&var&url=doL&&&$.post(url,{staffname:$staffname,staffpwd:$staffpwd,verifycode:$verifycode},function(data){&&&&&&&&&if(data==codeerr){&&&&&&&&&&&&&&&&&alert(验证码错误!);&&&&&&&&&}else&if(data==authempty){&&&&&&&&&&&&&&&&&alert(请输入用户名或密码!)&&&&&&&&&}else&if(data==autherr){&&&&&&&&&&&&&&&&&alert(用户名或密码错误!);&&&&&&&&&}else&if(data==success){&&&&&&&&&&&&&&&&&alert(登录成功!);&&&&&&&&&&&&&&&&&location.href=&/&&&br&2.下载文件的时候,总是莫名多出许多html的东西,原因是缓冲区没有清空,可以通过以下代码进行修改,不过这种方式实际上是下载的仍然是html格式的文件,只不过改了一下后缀名为xls而已,因而用excel打开的时候会提示格式问题,忽略即可。同时需要注意使用&icov()函数转换编码,因为xls默认编码格式并非utf-8.&br&&br&&pre&class=&brush:&&ob_start();&&ob_end_clean();&&Header(&Content-type:&application/octet-stream);&&&Header(&Accept-Ranges:&bytes&);&&&Header(&Content-type:application/vnd.ms-charset=gb2312);&&&&&Header(&Content-Disposition:filename={$filename}.xls);&/pre&&br&3.在删除文件时会遇到路径问题,因为项目中使用的较多的是相对路径,即相对入口文件而言,但是删除文件则需要使用绝对路径,我并没有找到合适的解决方法,只好用了比较保守的方式,代码如下&br&&br&&pre&class=&brush:&&$path=./Public/uploads/;&&&&&&&$path=str_replace(\,/,realpath($path)./);&&&br&4.在配置nginx和php方面,我使用了fastCGI的方式,将如下代码保存为cmd文件,直接点击运行就可以了&br&&br&F:phpphp-cgi.exe&-b&127.0.0.1:9000&-c&F:phpphp.ini&&br&然后在nginx的配置文件里加上几句话&br&&pre&class=&brush:&&location&~&.php/?.*&{&&&&&&&&&&&&&&root&&&&&&&&&&&&&&&&&&&&&&&&&fastcgi_pass&&&127.0.0.1:9000;&&&&&&&&&&&&&&&fastcgi_index&&index.&&&&&&&&&&&&&&&fastcgi_param&&SCRIPT_FILENAME&&$document_root$fastcgi_script_name;&&&&&&&&&&&&&&include&&&&&&&&fastcgi_&&&&&&&&&&&&&&#定义变量&$path_info&,用于存放pathinfo信息&&&&&&&&&&&&&&&set&$path_info&;&&&&&&&&&&&&&&&#定义变量&$real_script_name,用于存放真实地址&&&&&&&&&&&&&&&set&$real_script_name&$fastcgi_script_name;&&&&&&&&&&&&&&&#如果地址与引号内的正则表达式匹配&&&&&&&&&&&&&&&if&($fastcgi_script_name&~&^(.+?.php)(/.+)$)&{&&&&&&&&&&&&&&&&&&&&&&&#将文件地址赋值给变量&$real_script_name&&&&&&&&&&&&&&&&&&&&&&&set&$real_script_name&$1;&&&&&&&&&&&&&&&&&&&&&&&#将文件地址后的参数赋值给变量&$path_info&&&&&&&&&&&&&&&&&&&&&&&set&$path_info&$2;&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&#配置fastcgi的一些参数&&&&&&&&&&&&&&&fastcgi_param&SCRIPT_FILENAME&$document_root$real_script_name;&&&&&&&&&&&&&&&fastcgi_param&SCRIPT_NAME&$real_script_name;&&&&&&&&&&&&&&&fastcgi_param&PATH_INFO&$path_info;&&&&&&&&&&&}匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。PHP语言, PHP扩展, Zend引擎相关的研究,技术,新闻分享 – 左手代码 右手诗
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
fastcgi_pass
127.0.0.1:9000;
所以,对于形如/laruence/info.php/pathinfo这样的文件路径, Nginx是不会正确的交给php cgi服务器的. 所以我们需要改写这段配置为:
location ~ .php {//片段匹配
fastcgi_index
fastcgi_pass
127.0.0.1:9000;
现在, 脚本路径已经交由PHP自己处理了. 那怎么增加PATH_INFO呢?
首先, 我们需要打开PHP中cgi.fix_pathinfo配置项, 打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO(), 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值(其实也就是说明, PHP最初对CGI 1.1的支持并不到位)
然后, 就只要添加一个FASTCGI_PARAM项就好了:
location ~ .php {
fastcgi_index
fastcgi_pass
127.0.0.1:9000;
fastcgi_param
PATH_INFO $fastcgi_script_
现在试试吧…
btw: 当然, 上面的解决方法, 把对路径的分析交给了PHP去处理, 网上也有朋友给出了另外一种配置方法, 这个方法是由Nginx来分析路径(也就不需要fix_pathinfo):
location ~ \.php
fastcgi_index index.
fastcgi_pass 127.0.0.1:9000;
set $path_info &&;
set $real_script_name $fastcgi_script_
if ($fastcgi_script_name ~ &^(.+?\.php)(/.+)$&) {
set $real_script_name $1;
set $path_info $2;
fastcgi_param SCRIPT_FILENAME /var/html/$real_script_
fastcgi_param SCRIPT_NAME $real_script_
fastcgi_param PATH_INFO $path_
后记, 最近发现的一个安全漏洞()和这个配置有关系, 请大家务必在使用第二种配置的时候,关闭cgi.fix_pathinfo. 另外关于这个漏洞我个人认为这个和Nginx没啥关系, 不属于Nginx的漏洞. 是配置的问题, 现在到处都在说是Nginx的Bug, 不妥不妥.
Related Posts:
Filed in ,
Leave a Reply
开发组核心成员, 顾问, PHP7主要开发者, , , 等开源项目作者.5168人阅读
开发速记(29)
我们在安装lnmp一键安装的时候,一般都没有开启访问pathinfo模式
这种模式在比较多的框架中用到,比如国人的ThinkPHP,还比如C写的Yaf也用到,不支持就比较可惜了。
pathinfo的原理就是将index.php/xxxx/xxx类似的网址当做php来执行,并且需要将xxx/xxx写入到$_SERVER[‘PATH_INFO’]中
这个是lnmp.org(我装的就是这个,所以我以这个为例子)开出来的虚拟机的配置中的一段(vhost/***.conf),修改nginx配置文件也是这样修改
location ~ .*\.(php|php5)?$
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
大家明显看到,location中的正则中,写了一个$,悲剧了,表示就此结束(?表示前面的php只匹配一次,这个只是随便提提)
最终,应该如此处理(location哪里也修改了,因为我没有用到php5处理):
if (!-e $request_filename)
rewrite ^\/(.*)$ /index.php/$1
location ~ \.php
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
set $path_info &&;
set $real_script_name $fastcgi_script_
if ($fastcgi_script_name ~ &^(.+?\.php)(/.+)$&) {
set $real_script_name $1;
set $path_info $2;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_
fastcgi_param SCRIPT_NAME $real_script_
fastcgi_param PATH_INFO $path_
后面的部分处理我是参考的网络上搜索到的文档,带注释版告诉大家
location ~ \.php
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
set $path_info &&;#初始化一个变量
set $real_script_name $fastcgi_script_#初始化一个变量,并且获取到一个原始赋值
if ($fastcgi_script_name ~ &^(.+?\.php)(/.+)$&) {#检测如果.php后面还存在/开始参数,将参数处理
set $real_script_name $1;#将第一个正则子串匹配到的赋值
set $path_info $2;#将第二个正则子串匹配到的赋值
fastcgi_param SCRIPT_FILENAME $document_root$real_script_#修改SCRIPT_FILENAME值
fastcgi_param SCRIPT_NAME $real_script_#修改SCRIPT_NAME值
fastcgi_param PATH_INFO $path_#修改PATH_INFO值
#上述三个赋值都是replace into的模式,这些值都是写在fcgi.conf中
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:130775次
积分:1764
积分:1764
排名:第17738名
原创:47篇
评论:22条
(2)(1)(2)(1)(1)(5)(1)(2)(3)(1)(2)(1)(2)(2)(2)(1)(3)(2)(2)(5)(10)如何在安装的lnmp一键环境包(nginx)启用pathinfo URL模式_Nginx学习_ThinkSAAS
如何在安装的lnmp一键环境包(nginx)启用pathinfo URL模式
如何在安装的lnmp一键环境包(nginx)启用pathinfo URL模式
我们在安装lnmp一键安装的时候,一般都没有开启访问pathinfo模式
这种模式在比较多的框架中用到,比如国人的ThinkPHP,还比如C写的Yaf也用到,不支持就比较可惜了。
pathinfo的原理就是将index.php/xxxx/xxx类似的网址当做php来执行,并且需要将xxx/xxx写入到$_SERVER[‘PATH_INFO’]中
这个是lnmp.org(我装的就是这个,所以我以这个为例子)开出来的虚拟机的配置中的一段(vhost/***.conf),修改nginx配置文件也是这样修改
location ~ .*.(php|php5)?$
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
大家明显看到,location中的正则中,写了一个$,悲剧了,表示就此结束(?表示前面的php只匹配一次,这个只是随便提提)
最终,应该如此处理(location哪里也修改了,因为我没有用到php5处理):
if (!-e $request_filename)
rewrite ^/(.*)$ /index.php/$1
location ~ .php
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
set $path_info "";
set $real_script_name $fastcgi_script_
if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {
set $real_script_name $1;
set $path_info $2;
fastcgi_param SCRIPT_FILENAME $document_root$real_script_
fastcgi_param SCRIPT_NAME $real_script_
fastcgi_param PATH_INFO $path_
后面的部分处理我是参考的网络上搜索到的文档,带注释版告诉大家
location ~ .php
try_files $uri =404;
fastcgi_pass
unix:/tmp/php-cgi.
fastcgi_index index.
include fcgi.
set $path_info "";#初始化一个变量
set $real_script_name $fastcgi_script_#初始化一个变量,并且获取到一个原始赋值
if ($fastcgi_script_name ~ "^(.+?.php)(/.+)$") {#检测如果.php后面还存在/开始参数,将参数处理
set $real_script_name $1;#将第一个正则子串匹配到的赋值
set $path_info $2;#将第二个正则子串匹配到的赋值
fastcgi_param SCRIPT_FILENAME $document_root$real_script_#修改SCRIPT_FILENAME值
fastcgi_param SCRIPT_NAME $real_script_#修改SCRIPT_NAME值
fastcgi_param PATH_INFO $path_#修改PATH_INFO值
#上述三个赋值都是replace into的模式,这些值都是写在fcgi.conf中
PHP开发框架
开发工具/编程工具
服务器环境
ThinkSAAS商业授权:
ThinkSAAS为用户提供有偿个性定制开发服务
ThinkSAAS将为商业授权用户提供二次开发指导和技术支持
让ThinkSAAS更好,把建议拿来。
开发客服微信}

我要回帖

更多关于 nginx不支持pathinfo 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信