$_SERVER 是 PHP 自動建立的超全域陣列,包含 HTTP 標頭、腳本路徑、伺服器環境、請求資訊等關鍵資料。鍵名大小寫不敏感,但慣用大寫。本文整理 28 個常用鍵值,附帶說明、範例值與實務用法。
| 鍵名 | 說明 | 範例值 | 實務用法 |
|---|---|---|---|
| PHP_SELF | 當前執行腳本路徑 (相對 DocumentRoot) | /index.php | 表單 action、自我引用連結 |
| SERVER_PROTOCOL | 請求協定名稱與版本 | HTTP/1.1 | 協定相容性檢查 |
| REQUEST_TIME | 請求開始時間戳 (Unix timestamp, PHP 5.1.0+) | 1704067200 | 效能計時、快取驗證 |
| argv | 命令列參數陣列 (CLI 模式) | Array([0] => arg1) | CLI 腳本參數解析 |
| SERVER_NAME | 伺服器主機名 (Host 標頭或虛擬主機設定) | example.com | 生成絕對 URL、多站點識別 |
| SERVER_SOFTWARE | 伺服器軟體識別字串 | Apache/2.4.41 (Ubuntu) | 環境診斷、相容性判斷 |
| REQUEST_METHOD | HTTP 請求方法 | GET, POST, PUT, DELETE | RESTful 路由、CSRF 保護 |
| QUERY_STRING | URL 查詢字串 (問號後內容) | id=123&cat=php | 分頁保留參數、追蹤來源 |
| DOCUMENT_ROOT | 腳本所在文件根目錄 (伺服器設定) | /var/www/html | 檔案絕對路徑計算、安全檢查 |
| HTTP_ACCEPT | 客戶端 Accept 標頭 | text/html,application/xhtml+xml | 內容協商、API 版本控制 |
| HTTP_ACCEPT_CHARSET | 客戶端 Accept-Charset 標頭 | utf-8, iso-8859-1 | 編碼協商 |
| HTTP_ACCEPT_ENCODING | 客戶端 Accept-Encoding 標頭 | gzip, deflate, br | 判斷是否啟用壓縮輸出 |
| HTTP_ACCEPT_LANGUAGE | 客戶端 Accept-Language 標頭 | zh-TW,zh;q=0.9,en;q=0.8 | 多語系自動偵測 |
| HTTP_CONNECTION | 客戶端 Connection 標頭 | keep-alive | 長連線處理 |
| HTTP_HOST | 客戶端 Host 標頭 (含端口) | example.com:8080 | 生成正規 URL、虛擬主機路由 |
| HTTP_REFERER | 來源頁面 URL (不可靠,可被偽造/攔截) | https://google.com/search?q=php | 防盜鏈、返回上頁、統計來源 |
| HTTP_USER_AGENT | 客戶端瀏覽器識別字串 | Mozilla/5.0 (Windows NT 10.0; Win64; x64)... | 裝置偵測、瀏覽器相容、爬蟲識別 |
| HTTPS | HTTPS 請求時為非空值 (通常 'on') | on | 強制 HTTPS、生成安全連結 |
| REMOTE_ADDR | 客戶端 IP 位址 | 203.0.113.195 | IP 限制、地理定位、日誌記錄 |
| REMOTE_HOST | 客戶端主機名 (需啟用 DNS 反查) | host.example.com | 內網識別、安全審計 |
| REMOTE_PORT | 客戶端連接埠 | 54321 | 連線追蹤、防火牆關聯 |
| SCRIPT_FILENAME | 當前執行腳本絕對路徑 | /var/www/html/index.php | require_once 路徑、檔案存在性檢查 |
| SERVER_ADMIN | Apache ServerAdmin 指令值 | webmaster@example.com | 錯誤通知收件者 |
| SERVER_PORT | 伺服器監聽埠 | 80 / 443 | 生成正規 URL、非標準埠處理 |
| SERVER_SIGNATURE | 伺服器版本與虛擬主機名字串 (錯誤頁面用) | Apache/2.4.41 Server at example.com Port 80 | 自定義錯誤頁面 |
| PATH_TRANSLATED | 檔案系統路徑 (虛擬對應實體後) | /var/www/html/path/info | PATH_INFO 處理 |
| SCRIPT_NAME | 當前腳本路徑 (同 PHP_SELF 但較標準) | /index.php | 自我引用、路由基準 |
| REQUEST_URI | 完整請求 URI (含查詢字串) | /index.php?id=123&cat=php | 路由解析、當前頁面完整 URL |
| PHP_AUTH_DIGEST | HTTP Digest 認證 Authorization 標頭內容 | Digest username="user", realm="..." | Digest 認證驗證 |
| PHP_AUTH_USER | HTTP Basic 認證使用者名稱 | admin | Basic 認證、簡易存取控制 |
| PHP_AUTH_PW | HTTP Basic 認證密碼 | secret123 | Basic 認證驗證 |
| AUTH_TYPE | HTTP 認證類型 | Basic / Digest | 認證方式分派 |
function getCurrentUrl() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
return $protocol . '://' . $host . $uri;
}
function getClientIp() {
$keys = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_X_FORWARDED', 'HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_FORWARDED_FOR', 'HTTP_FORWARDED', 'REMOTE_ADDR'];
foreach ($keys as $key) {
if (!empty($_SERVER[$key])) {
$ips = explode(',', $_SERVER[$key]);
return trim($ips[0]); // 取第一個 (最原始客戶端)
}
}
return 'unknown';
}
function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
$referer = $_SERVER['HTTP_REFERER'] ?? '';
if (strpos($referer, $_SERVER['HTTP_HOST']) === false) {
// 非本站來源,可返回 403 或預設圖片
header('HTTP/1.1 403 Forbidden');
exit('Hotlinking not allowed');
}
HTTP_REFERER、**HTTP_USER_AGENT、HTTP_X_FORWARDED_FOR 皆可輕易偽造SERVER_NAME 受虛擬主機設定影響,不如 HTTP_HOST 可靠 (但後者也可偽造)$_SERVER 缺少 HTTP_* 相關鍵,需判斷 php_sapi_name() === 'cli'$_SERVER 是 PHP 與伺服器環境溝通的橋樑。熟練掌握 REQUEST_URI、HTTP_HOST、REQUEST_METHOD、REMOTE_ADDR、HTTPS 等高頻鍵值,並謹記 **「客戶端提供的資料不可信」** 原則,能編寫更安全、可攜、高效的 PHP 應用。