request_uri在apache中最可靠,能准确返回请求路径加查询字符串;nginx需显式配置fastcgi_param;iis常用http_x_rewrite_url替代;php旧版本或cgi环境可能不可用,需降级兼容。
![php $_server [\'request_uri\'] 不同 web 服务器取值差异](https://img.php.cn/upload/article/001/503/042/179126983863614.png?x-oss-process=image/resize,p_40)
REQUEST_URI 在 Apache 中最可靠
Apache 默认完整支持 $_SERVER['REQUEST_URI'],能准确返回请求路径加查询字符串,比如访问 /user/profile?id=123,就得到 /user/profile?id=123。它不依赖重写规则,也不受 PHP 运行模式(mod_php 或 FPM)影响,在标准 LAMP 环境下行为稳定。
Nginx 下需注意 CGI 兼容性
Nginx 本身不原生设置 REQUEST_URI,而是由 PHP-FPM 在 CGI 模式下模拟生成。多数现代配置会正确传递,但若未显式配置 fastcgi_param REQUEST_URI $request_uri;,可能出现以下情况:
- 值为空或为根路径
/ - 路径缺失查询参数(只保留路径部分)
- 在 PATH_INFO 模式下,内容被截断或重复
IIS 和 Windows 主机常用 HTTP_X_REWRITE_URL 替代
IIS 默认不设 REQUEST_URI,尤其在启用 URL Rewrite 模块后,实际请求路径常存于 $_SERVER['HTTP_X_REWRITE_URL']。例如:
- 真实请求:
https://site.com/blog/post/123 - REQUEST_URI 可能是
/index.php(被重写掩盖) - HTTP_X_REWRITE_URL 则为
/blog/post/123
因此跨平台兼容写法常需 fallback 判断:
if (isset($_SERVER['HTTP_X_REWRITE_URL'])) {$uri = $_SERVER['HTTP_X_REWRITE_URL'];
} elseif (isset($_SERVER['REQUEST_URI'])) {
$uri = $_SERVER['REQUEST_URI'];
} else {
$uri = '/';
}
CGI 和某些旧版 PHP 环境可能完全不可用
PHP 4.1.0 以下版本不支持 REQUEST_URI;以 CGI 方式运行且未配置环境变量时,该键可能不存在。可通过 isset($_SERVER['REQUEST_URI']) 安全检测,避免 Notice 错误。若必须支持极老环境,建议结合 SCRIPT_NAME 和 QUERY_STRING 手动拼接:
if (!empty($_SERVER['QUERY_STRING'])) {
$uri .= '?' . $_SERVER['QUERY_STRING'];
}
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











