为何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
相关产品推荐
相关产品推荐

