常用 $_SERVER 變數速查
| 變數 | 說明 | 範例 |
HTTP_HOST | 域名/主機位址 (含端口若非 80/443) | localhost / www.example.com:8080 |
PHP_SELF | 當前腳本路徑 (相對 DocumentRoot) | /blog/test.php |
QUERY_STRING | 查詢字串 (問號後內容) | id=5&page=2 |
HTTP_REFERER | 來源頁面 URL (可偽造/為空) | https://google.com/search?q=php |
REQUEST_URI | 完整請求 URI (含查詢字串) | /blog/test.php?id=5 |
SERVER_NAME | 伺服器主機名 (由 Apache 設定決定) | www.example.com |
SERVER_PORT | 伺服器通訊埠 | 80 / 443 / 8080 |
HTTPS | 是否為 HTTPS 連線 (on/off) | on |
組合完整 URL 範例
<?php
// 1. 簡易版 (忽略 HTTPS/非標準埠)
echo 'https://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
// 2. 完整版 (支援 HTTPS、非標準埠)
function curPageURL() {
$pageURL = 'http';
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') $pageURL .= 's';
$pageURL .= '://';
if ($_SERVER['SERVER_PORT'] != '80') {
$pageURL .= $_SERVER['SERVER_NAME'] . ':' . $_SERVER['SERVER_PORT'] . $_SERVER['REQUEST_URI'];
} else {
$pageURL .= $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
}
return $pageURL;
}
echo curPageURL();
// 3. 僅取目錄路徑
$url = 'https://' . $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
echo dirname($url); // 輸出不含檔名的目錄
?>
常見陷阱
HTTP_HOST 可能包含端口,SERVER_NAME 不含端口但依賴 Apache ServerName 設定。
- 反向代理 (Nginx/Cloudflare) 後
REMOTE_ADDR、HTTP_HOST 可能不準,需讀取 HTTP_X_FORWARDED_FOR、HTTP_X_FORWARDED_HOST。
REQUEST_URI 包含查詢字串,PHP_SELF 不含。