包含 HTTP 頭、腳本路徑、服務器信息、請求元數據等關鍵環境變量,是 Web 開發中獲取請求上下文的核心入口。
| 分類 | 鍵名 | 說明 | 示例值 |
|---|---|---|---|
| 請求信息 | REQUEST_METHOD | HTTP 方法 | GET, POST, PUT, DELETE |
| REQUEST_URI | 完整請求 URI | /api/user?id=123 | |
| QUERY_STRING | 查詢字符串 | id=123&page=2 | |
| HTTP_REFERER | 來源頁面 URL | https://google.com/search?q=php | |
| HTTP_USER_AGENT | 客戶端標識 | Mozilla/5.0... Chrome/119.0 | |
| CONTENT_TYPE | 請求體類型 | application/json | |
| 腳本路徑 | SCRIPT_FILENAME | 當前腳本絕對路徑 | /var/www/html/index.php |
| SCRIPT_NAME | 腳本路徑(Web 可訪問) | /index.php | |
| PHP_SELF | 相對 DocumentRoot 路徑 | /index.php | |
| DOCUMENT_ROOT | Web 根目錄 | /var/www/html | |
| PATH_INFO | 路徑額外信息 | /api/user/123 | |
| 服務器信息 | SERVER_NAME | 主機名 | example.com |
| SERVER_PORT | 端口 | 80, 443 | |
| SERVER_PROTOCOL | 協議版本 | HTTP/1.1, HTTP/2 | |
| SERVER_SOFTWARE | Server 軟件 | nginx/1.24.0 | |
| 客戶端信息 | REMOTE_ADDR | 客戶端 IP | 203.0.113.195 |
| REMOTE_PORT | 客戶端端口 | 54321 | |
| REMOTE_HOST | 客戶端主機名 | host.example.com | |
| HTTP_X_FORWARDED_FOR | 代理鏈 IP(需信任代理) | 203.0.113.195, 198.51.100.1 | |
| HTTPS/CLI | HTTPS | 是否 HTTPS | on / off |
| REQUEST_TIME | 請求開始 Unix 時間戳 | 1699999999 | |
| REQUEST_TIME_FLOAT | 微秒級時間戳 | 1699999999.1234 | |
| argv / argc | CLI 參數數組/個數 | ['arg1', 'arg2'] / 2 |
HTTP_X_FORWARDED_FOR、HTTP_REFERER、HTTP_USER_AGENT 皆不可信real_ip_header、set_real_ip_from)HTTP_*、REQUEST_URI 等 Web 專屬鍵<?php
class ServerRequest
{
public function getClientIp(): string
{
// 遞歸檢查代理頭(需配置受信代理列表)
foreach (['HTTP_CF_CONNECTING_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'] as $key) {
if (!empty($_SERVER[$key])) {
$ips = array_map('trim', explode(',', $_SERVER[$key]));
return $ips[0];
}
}
return 'unknown';
}
public function isHttps(): bool
{
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| ($_SERVER['SERVER_PORT'] ?? 80) === 443;
}
public function getBaseUrl(): string
{
$scheme = $this->isHttps() ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? 'localhost';
return $scheme . '://' . $host;
}
}
<?php // 僅開發環境使用 echo '<pre>'; print_r($_SERVER); echo '</pre>';
