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. 此处就不说明这种方法了~
第二种方法:
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;
}
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;
}
相关文章:
- win7+iis+php+fastcgi安装 - 11月02日 13:57
- 在win2003下使用iis6+fastcgi+php+mysql - 2011年02月17日 01:02
- eAccelerator for php 5.3.4 on windows at vc6 - 2011年01月06日 22:49
- 读书 - 实战Nginx:取代Apache的高性能Web服务器 - 2010年04月24日 00:16
- 记录,今天搞了我大半天,扑街的php+win7 - 2010年04月20日 18:07
- 返璞归真:面向过程的装饰模式实现 - 2010年04月11日 20:04
- 代理(Proxy)和委派(Delegate)的区别 - 2010年04月11日 20:04
- 10个免费的图表生成代码 - 2010年04月04日 23:51
- 招聘php开发工程师 - 2010年03月29日 15:28
- 在win7下使用zend studio 7.1.0,解决汉化、中文乱码、js等问题 - 2010年01月16日 23:45
