
本文介绍如何在 php 中准确获取用户浏览器地址栏显示的完整 url(含协议、域名和路径),尤其适用于 .htaccess 重写后的友好 url 场景。
本文介绍如何在 php 中准确获取用户浏览器地址栏显示的完整 url(含协议、域名和路径),尤其适用于 .htaccess 重写后的友好 url 场景。
在 PHP 开发中,常需获取当前页面的完整访问地址(例如 https://www.example.com/page/some-page/),但直接使用 $_SERVER['REQUEST_URI'] 仅返回服务器接收到的请求路径(如 /page.php?slug=some-page),无法反映浏览器地址栏中经 .htaccess 重写后的真实 URL。关键在于:重写发生在 Apache/Nginx 层,PHP 接收的是重写后的内部路径,而非原始请求 URI——而浏览器实际发出的请求头中,Host 和原始路径信息已不可见。因此,我们需通过组合服务器变量重建“用户看到的 URL”。
正确做法是手动拼接协议(HTTP/HTTPS)、主机名(HTTP_HOST)和请求路径(REQUEST_URI):
<?php // 判断是否为 HTTPS 协议(注意:部分反向代理环境下需检查 X-Forwarded-Proto) $scheme = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') ? 'https' : 'http'; $host = $_SERVER['HTTP_HOST'] ?? ''; $request_uri = $_SERVER['REQUEST_URI'] ?? '/'; $url = $scheme . '://' . ltrim($host, ' ') . '/' . ltrim($request_uri, '/'); echo rtrim($url, '/'); // 可选:移除末尾多余斜杠 ?>
⚠️ 注意事项:
-
$_SERVER['HTTP_HOST']依赖客户端请求头,存在被篡改风险(如恶意构造 Host 头),生产环境建议配合白名单校验; - 若应用部署在反向代理(如 Nginx + PHP-FPM 或云 WAF)后,
HTTPS状态可能由X-Forwarded-Proto头传递,此时应优先读取该头:$scheme = $_SERVER['HTTP_X_FORWARDED_PROTO'] ?? ($scheme);
-
REQUEST_URI始终包含查询字符串(如?id=123),若只需路径部分,可用parse_url($request_uri, PHP_URL_PATH)提取; - 不要使用
$_SERVER['PHP_SELF']或$_SERVER['SCRIPT_NAME'],它们返回脚本自身路径,与重写 URL 无关。
总结:PHP 本身无法直接获取“浏览器地址栏原始输入”,但通过安全拼接 scheme + HTTP_HOST + REQUEST_URI,可高度还原用户可见的完整 URL。该方法轻量、兼容性强,是重写场景下的标准实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











