通過 $_SERVER 超全局變量可獲取當前請求的完整 URL 信息。本文匯總最常用的組合方式,可直接複製到項目工具類中。
| 變量 | 含義 | 示例 |
|---|---|---|
| HTTP_HOST | 域名(含端口若非標準) | example.com:8080 |
| SERVER_NAME | 服務器配置域名 | example.com |
| PHP_SELF | 腳本路徑(相對文檔根) | /index.php |
| REQUEST_URI | 完整請求 URI(含查詢串) | /index.php?id=1&a=2 |
| QUERY_STRING | 查詢字符串 | id=1&a=2 |
| HTTP_REFERER | 來源頁面(不可靠,可偽造) | https://google.com/ |
| SERVER_PORT | 服務器端口 | 80 / 443 / 8080 |
| HTTPS | 是否 HTTPS | on / off |
// 1. 域名 $host = $_SERVER['HTTP_HOST']; // 2. 當前腳本路徑 $script = $_SERVER['PHP_SELF']; // 3. 完整 URL(無端口,自動適配 HTTP/HTTPS) $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http'; $fullUrl = $scheme . '://' . $host . $_SERVER['REQUEST_URI']; // 4. 帶端口完整 URL $fullUrlWithPort = $scheme . '://' . $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI']; // 5. 僅路徑(不含查詢串) $pathOnly = $scheme . '://' . $host . $_SERVER['PHP_SELF']; // 6. 獲取目錄路徑 $dir = dirname($fullUrl);
function getCurrentUrl(bool $withQuery = true, bool $withPort = false): string {
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $withPort ? $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] : $_SERVER['HTTP_HOST'];
$uri = $withQuery ? $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF'];
return $scheme . '://' . $host . $uri;
}
// 用法
echo getCurrentUrl(); // 完整 URL
echo getCurrentUrl(false); // 無查詢串
echo getCurrentUrl(true, true); // 帶端口
HTTP_HOST 來自客戶端 Host 頭,可被偽造;安全敏感場景用 SERVER_NAME(需服務器正確配置)。REQUEST_URI 包含查詢串,PHP_SELF 不包含。
3. 反向代理(Nginx/Cloudflare)下需讀取 HTTP_X_FORWARDED_PROTO、HTTP_X_FORWARDED_FOR 判斷真實協議/IP。
4. HTTP_REFERER 非必發、可篡改,僅作統計參考,不可用於權限控制。