常用 $_SERVER 變數對照
| 變數 | 說明 | 範例 |
HTTP_HOST | 客戶端請求的 Host 標頭 (含港口) | example.com:8080 |
SERVER_NAME | 伺服器設定的主機名 (Apache ServerName) | example.com |
REQUEST_URI | 完整請求 URI (含查詢字串) | /path/page.php?id=1&k=2 |
PHP_SELF | 當前腳本路徑 (相對 DocumentRoot) | /path/page.php |
SCRIPT_NAME | 同 PHP_SELF,但較標準 | /path/page.php |
QUERY_STRING | 查詢字串 (不含 ?) | id=1&k=2 |
REQUEST_METHOD | HTTP 方法 | GET, POST |
HTTPS | 是否 HTTPS (on/off 或 1/0) | on |
HTTP_REFERER | 來源頁面 (不可靠,可偽造) | https://google.com/search?q=php |
HTTP_USER_AGENT | 客戶端 UA 字串 | Mozilla/5.0... |
REMOTE_ADDR | 客戶端 IP (經 Proxy 需看 X-Forwarded-For) | 203.0.113.45 |
SERVER_ADDR | 伺服器 IP | 192.168.1.10 |
SERVER_PORT | 伺服器埠號 | 80, 443 |
DOCUMENT_ROOT | 網站根目錄絕對路徑 | /var/www/html |
實用組合函數
function getCurrentUrl(): string {
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
$uri = $_SERVER['REQUEST_URI'] ?? '';
return $scheme . '://' . $host . $uri;
}
function getBaseUrl(): string {
$scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
return $scheme . '://' . $host;
}
function getClientIp(): string {
$headers = ['HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP', 'HTTP_CLIENT_IP'];
foreach ($headers as $h) {
if (!empty($_SERVER[$h])) {
$ips = explode(',', $_SERVER[$h]);
return trim($ips[0]);
}
}
return $_SERVER['REMOTE_ADDR'] ?? 'unknown';
}
安全提醒
- 不可信任 `HTTP_REFERER`、`HTTP_X_FORWARDED_FOR` 等客戶端可控標頭,僅作參考/日誌。
- 反向代理 (Nginx/Cloudflare) 後需設定 `real_ip_header` / `set_real_ip_from` 並信任代理 IP,PHP 才能正確取得真實 IP。
- `PHP_SELF` 直接輸出到表單 `action` 易受 XSS,務必 `htmlspecialchars()`。
除錯技巧
<?php
// 快速查看所有 $_SERVER
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
?>