You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何REQUEST_URI被修改?PHP请求URI处理异常咨询

为什么$_SERVER['REQUEST_URI']没有原样传递请求路径?

这事儿本质是Web服务器的路径规范化行为在搞鬼——PHP拿到的REQUEST_URI已经是服务器处理后的结果,不是你curl发送的原始路径。我给你拆解下具体原因:

  • 服务器会自动解析路径中的.和..
    所有主流Web服务器(Apache、Nginx、IIS等)在把请求递交给PHP之前,都会先对URL路径做规范化处理:

    • 遇到./(当前目录):直接忽略,因为它不会改变当前路径层级,所以/city/./会被简化成/city/
    • 遇到../(父目录):会向上回溯一级路径,比如/city/../就等价于直接去掉city/这一段,所以你看到/req.php/postcode/14482/city/../country/de/变成了/req.php/postcode/14482/country/de/
    • 但...不属于标准的路径导航符号,服务器没法把它解析成“当前/父目录”,所以会原封不动保留下来,当作路径的一部分。
  • $_SERVER['REQUEST_URI']是服务器传递的“加工后”值
    PHP的$_SERVER超全局变量里的REQUEST_URI,是Web服务器处理完路径规范化后传递给PHP的,不是原始的请求字符串。如果一定要获取用户发送的原始未修改路径,得通过服务器配置来传递这个信息:

    举两个常见服务器的配置例子:

    • Apache:可以通过RewriteRule把原始请求信息存到环境变量里

      RewriteEngine On
      RewriteRule ^(.*)$ - [E=ORIGINAL_URI:%{THE_REQUEST}]
      

      然后在PHP里可以通过$_SERVER['ORIGINAL_URI']拿到原始请求行(比如GET /req.php/postcode/14482/city/./country/de/ HTTP/1.1),再自行提取路径部分。

    • Nginx:在FastCGI配置里传递原始URI

      location ~ \.php$ {
          # 其他原有配置...
          fastcgi_param ORIGINAL_URI $request_uri;
      }
      

      之后PHP里就能通过$_SERVER['ORIGINAL_URI']直接拿到原始请求路径了。

简单说就是:服务器先帮你“整理”了路径,PHP拿到的是整理后的版本;要原始的,就得让服务器把原始信息额外传给PHP。

内容的提问来源于stack exchange,提问作者kalle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:36:21