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;
}

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 普罗米修斯监控系统搭建(MAC环境基于Docker)「建议收藏」

    普罗米修斯监控系统搭建(MAC环境基于Docker)「建议收藏」采用Docker环境搭建方式可以快速搭建起测试学习环境第一步:下载docker镜像dockerpullprom/node-exporterdockerpullprom/prometheusdockerpullgrafana/grafana第二步:启动exporter(理解为内置好的监控埋点)dockerrun-d-p9100:9100\-v”/proc:/host/proc:ro”\-v”/sys:/host/sys:ro”\-v”/:/roo

    2022年7月19日
    47
  • 实现组件的自动换行排布:

    实现组件的自动换行排布:

    2021年3月12日
    197
  • Hybrid App 开发快速指南[通俗易懂]

    Hybrid App 开发快速指南[通俗易懂]课程背景混合应用相对于原生应用而言,是原生应用和Web应用的结合体。过去几年,混合应用开发的各种利弊已得到充分的讨论和验证。关于混合应用是什么、为什么使用的问题,相信大家都有自己的答案,但如何开发混合应用,从现有资料中却很难找到一个系统、全面的回答。刚上手或准备上手混合应用的开发者,经常苦于没有一套经过验证的最佳实践来指导开发,在开发的各个阶段往往遇到各种问题:如何选型?如何架构前端…

    2022年4月19日
    68
  • 贴片电阻的阻值编码表_贴片电阻怎么看阻值

    贴片电阻的阻值编码表_贴片电阻怎么看阻值

    2022年8月21日
    3
  • java.lang.abstractMethodError的错误解决「建议收藏」

    java.lang.abstractMethodError的错误解决「建议收藏」日常开发中,如果在打包后遇到过java.lang.abstractMethodError的问题,其中一部分,可能是混淆引起的。解决方法就是把提示报错的地方,通过-keep的方式过滤掉,不让那些代码进行混淆。本人遇到的是一个RecyclerView使用时adapter中的getItemCount方法报错。原因是Adapter是内部类,而getItemCount是公共方法。getItemCo…

    2022年5月5日
    681
  • GOGS代码仓库迁移教程

    GOGS代码仓库迁移教程前言安装复制原始仓库数据修改用户配置启动 gogs 关键步骤更新 authorized keys 和 HooK0 前言 GOGS 部署到本机比较方便 这次遇到需要将 GOGS 从 win10 系统迁移到安装 UbuntuMate 的树莓派上面 在此记录下迁移教程 1 安装树莓派需要下载对应的版本 raspi2 armv6 zip 下载地址 https dl gogs io 下载后解压到自定义目录 如

    2025年6月24日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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