Nginx服务器不支持PATH_INFO的问题及解决办法

最近在写一个小程序,然后里面自己写了个URL的处理器,比如说访问index.php/article 那么就会自动加载进来article页面,访问index.php/home就会自动加载home页面。

在Apache服务器中使用了 $_SERVER[‘HTTP_HOST‘] . $_SERVER[‘REQUEST_URI‘] 获取完整的URL地址并且对地址进行解析是成功的,因为在Apache中访问

index.php/article会被解析成访问index.php这个文件,但是在Nginx中这样访问的话就会出现404错误,页面未找到。

这是什么原因造成的呢?

在Apache中, 当不加配置的时候, 对于PHP脚本, AcceptPathInfo是默认接受的, 也就是说:

如果在服务器在存在一个/iwenku/index.php/

那么, 对于如下请求,

  1. 127.0.0.1/iwenku/index.php/article/
  2. 127.0.0.1/iwenku/article/

Apache都接受, 都会认为是对index.php的访问, 并会设置PATH_INFO为article

而对于Nginx下, 是不支持PATH INFO的, 也就是它不会默认设置PATH_INFO.

而因为默认的配置文件对PHP的支持只是很基础的, 所以对于默认配置来说对于上面的访问也会是404, 提示找不到文件出错.

对这个问题的解决方案便是修改Nginx的配置文件,模拟PATH_INFO:

首先 , 我们知道在Nginx中, 是通过对文件名的扩展名匹配, 来决定是否要交给php cgi服务器去解释的. 在nginx.conf中一般都有如下的默认配置段:

location ~ .php$ { //$代表结尾,这样对于后面跟随内容的URL地址就不会进行解析
     fastcgi_index index.php;
     fastcgi_pass 127.0.0.1:9000;
     include fastcgi_params;
}

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

location ~ .php {//只要含有.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, 并根据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;
}
时间: 2024-08-04 12:23:15

Nginx服务器不支持PATH_INFO的问题及解决办法的相关文章

Windows下Apache配置SSL以支持https及出错的解决办法

步骤一:安装apache,使其支持SSL,并安装php 1.安装配有SSL模块的apache,apache_2.2.8-win32-x86-openssl-0.9.8g 2.配置apache以支持SSL: 1)打开apache的配置文件conf/httpd.conf LoadModule ssl_module modules/mod_ssl.so Include conf/extra/httpd-ssl.conf 去掉两行前面的# 2)注意修改httpd-ssl.conf 文件里的两个字段: S

linux服务器更换主板后无法识别网卡解决办法

在我的超算集群里,有台服务器故障报修,主板坏了,更换主板后,无法识别网卡,用命令ifconfig -a 查看只显示lo loopback 127.0.0.1,以及eth7,eth8,eth9等没有网卡的信息,如此的话,导致服务器和集群别的节点服务器都无法ping通 原因和解决办法: 系统加载网卡驱动后会去读一个文件,这个文件是一个缓冲文件,包含了网卡的mac地址,因为更换了主板,网卡的mac地址也变了,但是这个文件的mac地址还没变,还是之前坏了的主板的上面的网卡的MAC地址,这样系统在加载网卡

服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

转载的服务器TIME_WAIT和CLOSE_WAIT详解和解决办法

IE8以下不支持css3 media query的解决办法

针对IE8以下不支持css3的media query,可以使用response.js解决 下载地址:https://github.com/scottjehl/Respond/ 这里有一篇关于其实现原理的文章:http://caibaojian.com/respondjs.html 引用时的注意点: 不可将媒介查询代码写在html内部,因为response是通过ajax分析link引入的css文件,故html里面的样式将被忽略. 引入文件需在css引入之后 <!--[if lte IE 8]>

服务器运维常见的故障及其解决办法

进入信息时代,各种行业对数据的安全和技术要求也越来越高,,同时也遇到了各种各样的服务器故障问题,虽然能够接到服务器厂商的支持,但是往往耗时耗工,特别是有些不能够立即判断和解决的问题,造成了企业不必要的损失,下面是针对一些常见的服务器故障现象和解决方法,以便更好的更快的进行故障处理和排查. 01 服务器常见故障及现象 有关服务器无法启动的主要原因 : ①市电或电源线故障(断电或接触不良) ②电源或电源模组故障 ③内存故障(一般伴有报警声) ④CPU故障(一般也会有报警声) ⑤主板故障 ⑥其它插卡造

IIS服务器修改文件提示权限不足的解决办法

最近做项目的经历,当我们在本地计算机上通过部署在IIS上的程序去操做文件时,在本地执行没有问题,但是部署到服务器上提示"没有权限"等等. 由于用云服务器时间不长,不是很懂,就细心研究了一下,幸好还懂一点,知道大致是什么原因,就google了一下, 详细的解决办法是: 1.找到你需要操作的文件的根文件夹,右键点击属性 点击安全->点击编辑 点击添加按钮 点击高级按钮,点击查找按钮,选中IIS_IUSRS 修改IIS_IUSRS权限,给IIS_IUSRS赋予修改权限,就可以了. 自己

Chrome浏览器42版本以上不支持silverlight 5.0的解决办法

场景: 浏览器:chrome V43 插件:silverlight 5.0 操作系统:xp 问题: 自己开发silverlight网站在IE7和firefox中能正常打开,但在chrome中打开失败. 原因: chrome 从42版本开始不支持NPAPI,(Chrome 42禁用NPAPI和相关插件:Java.Unity和Silverlight) 解决办法: 1.在Chrome浏览器地址栏中输入:chrome://flags/ 2.在打开的浏览器配置页面中找到"启用 NPAPI Mac, Win

Domino服务器宕机后无法启动的解决办法——仅出现版本信息

 [背景] 用户domino邮件服务器宕机后,启动时仅出现几行版本信息: Lotus Domino (r) Server, Release 8.5.2, August 10, 2010 Copyright (c) IBMCorporation 1987, 2010. All Rights Reserved. 然后就停住了,等了1个多小时都没反应. [问题跟踪] 尝试过很多办法: 删除log.nsf 用复本替换names.nsf 重新覆盖安装domino 服务器还是无法启动. [解决办法] 服

【LNMP】提示Nginx PHP “No input file specified”错误的解决办法

原理: 任何对.php文件的请求,都简单地交给php-cgi去处理,但没有验证该php文件是否存在. PHP文件不存在,没办法返回普通的404错误,它返回 一个404,并带上一句"No input file specified" 另外,还可能跟 路径或者 权限有关系,或者SCRIPT_FILENAME 变量没有被正确的设置(这在nginx是最常见的原因). 解决办法: 1 打开文件: usr/local/php/etc/php.ini,修改以下配置 把cgi.fix_pathinfo=