
本文详解为何 $_GET['url'] 无法显示当前访问地址,并提供基于 $_SERVER 的可靠方案获取完整 URL,同时指出 .htaccess 重写规则与变量用途的根本区别。
本文详解为何 `$_get['url']` 无法显示当前访问地址,并提供基于 `$_server` 的可靠方案获取完整 url,同时指出 `.htaccess` 重写规则与变量用途的根本区别。
在 PHP 开发中,一个常见误区是误将重写规则中的参数(如 .htaccess 中 RewriteRule ^(.+)$ index.php?url=$1)等同于“当前页面 URL”。实际上,$_GET['url'] 仅反映该请求中显式传递的查询参数(例如访问 index.php?url=home 时才存在),而非浏览器地址栏显示的实际 URL。当你通过 Apache 重写访问 http://192.168.1.100/mvc/about,虽然请求被内部转发到 index.php?url=about,但 $_GET['url'] 的值只是 'about' —— 它丢失了协议、域名、路径前缀等关键信息,更无法还原原始访问地址。
要准确获取用户当前访问的完整 URL(如 https://example.com/mvc/about?ref=123),必须依赖 $_SERVER 超全局数组中的多个键组合构建:
<?php
$current_url = sprintf(
'%s://%s%s',
isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) === 'on' ? 'https' : 'http',
$_SERVER['HTTP_HOST'],
$_SERVER['REQUEST_URI']
);
echo htmlspecialchars($current_url, ENT_QUOTES, 'UTF-8');
?>✅ 关键说明:
- $_SERVER['HTTPS'] 判断是否启用 HTTPS(注意部分服务器用 'on',部分用 '1',需兼容处理);
- $_SERVER['HTTP_HOST'] 提供域名或 IP(如 192.168.1.100 或 example.com),不包含协议;
- $_SERVER['REQUEST_URI'] 包含路径 + 查询字符串(如 /mvc/about?ref=123),已自动解码;
- 使用 htmlspecialchars() 输出前转义,防止 XSS 风险(尤其在调试或前端展示场景)。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 若部署在反向代理(如 Nginx + Apache)后,$_SERVER['HTTPS'] 和 $_SERVER['HTTP_HOST'] 可能不可靠,此时应检查 $_SERVER['HTTP_X_FORWARDED_PROTO'] 和 $_SERVER['HTTP_X_FORWARDED_HOST'](需确保代理可信并配置了 ProxyPreserveHost On);
- .htaccess 中的 RewriteRule 仅影响请求路由和 $_GET 参数,不会修改 $_SERVER 的原始请求信息;
- 不要依赖 $_SERVER['PHP_SELF'] 或 $_SERVER['SCRIPT_NAME'] 获取完整 URL —— 它们只返回脚本路径,不含查询参数和主机信息。
总结:$_GET['url'] 是路由分发的“内部标识符”,而 $_SERVER 才承载真实客户端请求上下文。理解二者职责边界,是构建可移植、安全、符合 REST 风格 URL 处理逻辑的基础。











