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

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错误,页面未找到。

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

这是什么原因造成的呢?

在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.fixcgi.fix_pathinfo=1(这个需要在php.ini文件中配置,如果没有需要自己添加)

打开这个配置项以后, PHP会去根据CGI规范来检查SCRIPT_FILENAME中那部分是访问脚本和PATH_INFO, 并根据SCRIPT_NAME来修改PATH_INFO(和PATH_TRANSLATED)为正确的值

然后需要更改nginx.conf文件的配置

location ~ .php {

  root “E:\www\wwwroot”;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  include fastcgi_params;
  #pathinfo support
  set $real_script_name $fastcgi_script_name;
  set $path_info ””;
  if ( $fastcgi_script_name ~ “^(.+?.php)(/.+)$”){

  set $real_script_name $1;
  set $path_info $2;
  }
  fastcgi_param SCRIPT_NAME $real_script_name;
  fastcgi_param PATH_INFO $path_info;
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/112493.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Python:Flask使用jsonify格式化时间

    Python:Flask使用jsonify格式化时间代码如下#-*-coding:utf-8-*-fromdatetimeimportdatetime,datefromflask.jsonimportJSONEncoderclassCustomJSONEncoder(JSONEncoder):defdefault(self,obj):ifisinstance(obj,datetime):returnobj.strftime(‘%Y-%m-%d%H:%M:%

  • PHP服务器端API原理及示例讲解(接口开发)

    PHP服务器端API原理及示例讲解(接口开发)

    2021年10月18日
  • Java的类加载机制

    Java的类加载机制Java的类加载机制

  • 吞噬星空鸿蒙殿主,论《吞噬星空》是鸿蒙三部曲的最后一部!

    吞噬星空鸿蒙殿主,论《吞噬星空》是鸿蒙三部曲的最后一部!该楼层疑似违规已被系统折叠隐藏此楼查看此楼众所周知,番茄的鸿蒙系列小说有两部已经完本,分别是《星辰变》和《盘龙》,不知道大家发现没有,在《星辰变》和《盘龙》的结尾部分番茄已经在文中埋下伏笔,预示着《吞噬星空》就是鸿蒙三部曲的最后一部作品!《盘龙》原文:鸿蒙金榜瞬间便吸收了这一丝灵魂之力,顿时在第一行,鸿字之后,出现了一个字林。一瞬间,林雷脑海中浮现了许多讯息,也会了不少神通能力。“原来,鸿蒙掌控…

  • 电脑自启动软件管理

    电脑自启动软件管理

  • 数据仓库ETL开发如何进行测试

    数据仓库ETL开发如何进行测试 数据仓库ETL开发如何进行测试?数据仓库ETL开发如何进行测试?由于数据仓库中数据量比较庞大,还有为了安全因素,一般在开发库和测试库数据不完全或者和生成库(正式库)不一致,导致在测试库和开发库中进行代码测试存在一定的问题。我们知道在软件开发过程中有很多测试的方法,按照测试方法可以分为白盒测试和黑盒测试。白盒测试也称结构测试或逻辑驱动测试,是指基于一个应用代码的内部逻辑

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号