如何配置RewriteRule使PHP可获取Apache重写后的REQUEST_URI
问题成因
$_SERVER['REQUEST_URI']是Apache存储的用户原始请求URI,设计上就不会随内部重写规则的执行而自动更新。你之前尝试的[L]/[PT]/[C]等RewriteRule标志位仅控制重写流程的路径匹配、规则串联逻辑,不会修改传递给PHP的原始请求变量,因此无论怎么调整这些标志都无法改变REQUEST_URI的输出。
解决方案
以下方案均不需要使用[R]标志,不会触发浏览器重定向,也不会修改地址栏显示内容:
方案1:通过自定义环境变量传递重写后URI(通用方案)
修改你的.htaccess配置如下:
RewriteEngine On # 匹配规则同时设置环境变量存储重写后的URI RewriteRule foo/(.*) /foo-$1 [E=REWRITE_URI:/foo-$1] RewriteRule . index.php [L]
Apache内部重写后会给自定义环境变量加上REDIRECT_前缀,PHP侧按如下逻辑读取即可:
<?php // 优先读取重写后的URI,不存在则 fallback 到原始请求URI $requestUri = $_SERVER['REDIRECT_REWRITE_URI'] ?? $_SERVER['REQUEST_URI']; echo $requestUri;
方案2:修改原生REQUEST_URI值(需mod_headers支持)
如果希望PHP不需要额外适配、直接读取$_SERVER['REQUEST_URI']就能拿到重写后的值,可以通过RequestHeader指令修改请求头,前提是你的服务器开启了mod_headers模块:
RewriteEngine On RewriteRule foo/(.*) /foo-$1 [E=NEW_REQUEST_URI:/foo-$1] # 当存在NEW_REQUEST_URI环境变量时,覆盖原生REQUEST_URI的值 RequestHeader set REQUEST_URI "%{NEW_REQUEST_URI}e" env=NEW_REQUEST_URI RewriteRule . index.php [L]
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

