$_SERVER 核心鍵值對照表
| 鍵名 | 含義 | 示例值 | 備註 |
| PHP_SELF | 當前腳本路徑(相對 Document Root) | /index.php | 包含查詢字符串時需配合 SCRIPT_NAME |
| argv | 命令行模式下傳遞給腳本的參數數組 | Array ( [0] => arg1 ) | CLI 專用 |
| argc | 命令行參數個數 | 1 | CLI 專用 |
| GATEWAY_INTERFACE | CGI 規範版本 | CGI/1.1 | |
| SERVER_NAME | 服務器主機名 | example.com | 虛擬主機下為 Host 頭值 |
| SERVER_SOFTWARE | 服務器標識字符串 | Apache/2.4.41 (Ubuntu) | |
| SERVER_PROTOCOL | 請求協議/版本 | HTTP/1.1 | |
| REQUEST_METHOD | 請求方法 | GET / POST / PUT / DELETE | |
| QUERY_STRING | 查詢字符串(? 後內容) | id=123&name=abc | |
| DOCUMENT_ROOT | 文檔根目錄絕對路徑 | /var/www/html | php.ini/docroot 設置 |
| HTTP_ACCEPT | Accept 請求頭 | text/html,application/xhtml+xml | |
| HTTP_ACCEPT_CHARSET | Accept-Charset 請求頭 | utf-8, iso-8859-1 | |
| HTTP_ACCEPT_ENCODING | Accept-Encoding 請求頭 | gzip, deflate, br | |
| HTTP_ACCEPT_LANGUAGE | Accept-Language 請求頭 | zh-CN,zh;q=0.9,en;q=0.8 | |
| HTTP_CONNECTION | Connection 請求頭 | keep-alive | |
| HTTP_HOST | Host 請求頭(含端口) | example.com:8080 | 關鍵:虛擬主機識別依賴此 |
| HTTP_REFERER | 來源頁面 URL(不可靠,可偽造/缺失) | https://google.com/ | 不應用於安全判斷 |
| HTTP_USER_AGENT | User-Agent 請求頭 | Mozilla/5.0 ... Chrome/119.0 | 設備/瀏覽器識別 |
| REMOTE_ADDR | 客戶端 IP | 203.0.113.195 | 代理下需看 X-Forwarded-For |
| REMOTE_HOST | 客戶端主機名(需 DNS 反解,通常關閉) | host.example.com | 罕見 |
| REMOTE_PORT | 客戶端連接端口 | 54321 | |
| SCRIPT_FILENAME | 當前執行腳本絕對路徑 | /var/www/html/index.php | 最可靠的腳本路徑 |
| SERVER_ADMIN | 管理員郵箱(Apache ServerAdmin 指令) | admin@example.com | |
| SERVER_PORT | 服務器監聽端口 | 80 / 443 | |
| SERVER_SIGNATURE | 服務器版本與虛擬主機名組成的字符串 | <address>Apache...</address> | 錯誤頁面常用 |
| PATH_TRANSLATED | 腳本文件系統路徑(非文檔根目錄) | /var/www/html/index.php | CGI 模式下不同 |
| SCRIPT_NAME | 當前腳本路徑(相對 Document Root) | /index.php | 表單 action 自提交常用 |
| REQUEST_URI | 請求 URI(含查詢字符串) | /index.php?id=123 | 路由解析核心依賴 |
| PHP_AUTH_USER | HTTP 認證用戶名 | admin | Apache 模塊模式 + HTTP Auth |
| PHP_AUTH_PW | HTTP 認證密碼 | secret | |
| AUTH_TYPE | HTTP 認證類型 | Basic / Digest | |
| REQUEST_TIME | 請求開始時間戳 (秒) | 1700000000 | PHP 5.1.0+ |
| REQUEST_TIME_FLOAT | 請求開始時間戳 (微秒) | 1700000000.1234 | PHP 5.4.0+ |
常見應用場景
1. 獲取客戶端真實 IP(考慮代理/CDN)
function getRealIp() {
$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'] ?? '0.0.0.0';
}
2. 判斷 HTTPS
$isHttps = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https')
|| (isset($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] === '443');
3. 構建當前完整 URL
$url = ($isHttps ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
4. CLI 模式下獲取參數
if (php_sapi_name() === 'cli') {
global $argv, $argc;
// $argv[0] 是腳本名,$argv[1...] 為參數
}
注意事項
- 不可信任:所有
HTTP_* 來自客戶端請求頭,可偽造;REMOTE_ADDR 在反向代理下為代理 IP。
- 環境差異:Apache mod_php、Nginx+PHP-FPM、CLI、內置服務器下部分鍵值存在差異或缺失。
- 安全:
PHP_SELF 直接輸出到表單 action 易導致 XSS,應用 htmlspecialchars($_SERVER['PHP_SELF']) 或改用 SCRIPT_NAME。