前言
$_SERVER 是 PHP 核心超全局變數,包含請求、服務器、腳本運行環境等關鍵信息。本文系統整理所有鍵值含義,重點解析 HTTP_X_FORWARDED_HOST 代理穿透實戰應用。
一、核心變數分類速查表
1. 腳本與請求基礎信息
| 鍵名 | 含義 | 示例 |
| PHP_SELF | 當前執行腳本文件名(相對文檔根目錄) | /index.php |
| argv | 傳遞給腳本的參數(CLI 模式) | Array([0]=>arg1) |
| argc | 命令行參數個數 | 2 |
| REQUEST_METHOD | 請求方法 | GET、POST、PUT、HEAD |
| QUERY_STRING | 查詢字串 | id=1&name=test |
| REQUEST_URI | 訪問 URI | /index.html?param=value |
| SCRIPT_FILENAME | 當前執行腳本絕對路徑 | /var/www/html/index.php |
| SCRIPT_NAME | 當前腳本路徑(自指向表單提交常用) | /index.php |
2. 服務器與協議信息
| 鍵名 | 含義 | 示例 |
| GATEWAY_INTERFACE | CGI 規範版本 | CGI/1.1 |
| SERVER_PROTOCOL | 通信協議名稱版本 | HTTP/1.1 |
| SERVER_NAME | 服務器主機名 | example.com |
| SERVER_SOFTWARE | 服務器標識字串 | Apache/2.4.41 |
| SERVER_PORT | 服務器端口 | 80、443 |
| SERVER_ADMIN | 管理員信息 | admin@example.com |
| SERVER_SIGNATURE | 服務器版本與虛擬主機名 | Apache/2.4.41 (Ubuntu) |
3. 客戶端與請求頭信息
| 鍵名 | 含義 | 示例 |
| 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 |
| HTTP_ACCEPT_LANGUAGE | Accept-Language 頭 | zh-CN,zh;q=0.9 |
| HTTP_CONNECTION | Connection 頭 | Keep-Alive |
| HTTP_HOST | Host 頭(含端口) | example.com:8080 |
| HTTP_REFERER | 來源頁面 URL | https://google.com/search?q=php |
| HTTP_USER_AGENT | 用戶代理字串 | Mozilla/5.0... |
| HTTPS | HTTPS 訪問標識 | on(HTTPS)/ off(HTTP) |
4. 客戶端網絡信息
| 鍵名 | 含義 | 示例 |
| REMOTE_ADDR | 客戶端 IP | 192.168.1.100 |
| REMOTE_HOST | 客戶端主機名 | client.example.com |
| REMOTE_PORT | 客戶端連接端口 | 54321 |
5. HTTP 認證相關(Apache 模塊模式)
| 鍵名 | 含義 |
| PHP_AUTH_USER | HTTP 認證用戶名 |
| PHP_AUTH_PW | HTTP 認證密碼 |
| AUTH_TYPE | 認證類型(Basic/Digest) |
二、重點實戰:HTTP_X_FORWARDED_HOST 代理穿透
1. 背景問題
通過代理/CDN/負載均衡訪問時,REMOTE_ADDR 獲取到的是代理 IP,非真實客戶端 IP。
2. 關鍵變數對比
| 變數 | 含義 | 可信度 |
| HTTP_X_FORWARDED_FOR | 客戶端真實 IP 鏈(可能多個,逗號分隔) | 中(可偽造) |
| HTTP_X_FORWARDED_HOST | 原始訪問的 Host(域名/IP) | 中 |
| HTTP_X_REAL_IP | Nginx 代理常用,真實客戶端 IP | 高(需代理配置) |
| HTTP_CLIENT_IP | 某些代理使用 | 低 |
3. 獲取真實 IP 最佳實踐
<?php
function getRealClientIp() {
$ipKeys = [
'HTTP_X_REAL_IP', // Nginx 代理首選
'HTTP_X_FORWARDED_FOR', // 標準代理頭
'HTTP_CLIENT_IP', // 部分代理
'REMOTE_ADDR' // 直連或兜底
];
foreach ($ipKeys as $key) {
if (!empty($_SERVER[$key])) {
// X-Forwarded-For 可能包含多個 IP,取第一個
$ips = explode(',', $_SERVER[$key]);
return trim($ips[0]);
}
}
return 'unknown';
}
// 獲取原始 Host(含代理情況)
$host = isset($_SERVER['HTTP_X_FORWARDED_HOST'])
? $_SERVER['HTTP_X_FORWARDED_HOST']
: (isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : '');
?>
4. 安全警示
- 不可完全信任:HTTP 頭可被客戶端偽造
- 需配合代理配置:Nginx
proxy_set_header X-Real-IP $remote_addr;
- 內網環境優先:僅在可信代理鏈路中使用
- 日誌記錄雙重記錄:同時記錄
REMOTE_ADDR 和解析出的真實 IP
三、文檔根目錄與路徑處理
<?php
// 文檔根目錄(Apache DocumentRoot)
$docRoot = $_SERVER['DOCUMENT_ROOT']; // /var/www/html
// 當前腳本文件系統路徑(非文檔根目錄)
$pathTranslated = $_SERVER['PATH_TRANSLATED']; // /var/www/html/index.php
// 當前腳本 URL 路徑
$scriptName = $_SERVER['SCRIPT_NAME']; // /index.php
?>
四、調試技巧:快速查看所有 $_SERVER
<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
// 或僅顯示鍵名
echo implode(', ', array_keys($_SERVER));
?>
掌握 $_SERVER 細節,能精準處理路由、代理穿透、安全防禦、多環境部署等核心場景。