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

如何配置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:15:06