$_SERVER 是 PHP 最重要的超全域變數之一,包含伺服器環境、請求標頭、腳本路徑等關鍵資訊。本文系統整理常用鍵值、實戰範例與注意事項,助你精準獲取執行上下文資訊。
| 鍵名 | 說明 | 範例值 |
|---|---|---|
PHP_SELF | 當前執行腳本路徑(相對 Document Root) | /test.php/foo.bar |
SERVER_PROTOCOL | 通訊協定名稱與版本 | HTTP/1.1 |
REQUEST_METHOD | 請求方法 | GET, POST, PUT |
REQUEST_TIME | 請求開始時間戳(PHP 5.1.0+) | 1699900000 |
QUERY_STRING | 查詢字串(? 之後內容) | id=1&name=test |
DOCUMENT_ROOT | 腳本所在文檔根目錄 | /var/www/html |
HTTP_ACCEPT | Accept 標頭內容 | text/html,application/xhtml+xml |
HTTP_HOST | Host 標頭(域名:埠) | example.com:80 |
HTTP_REFERER | 來源頁面 URL(不可靠,可偽造) | https://google.com/ |
HTTP_USER_AGENT | 用戶代理字串 | Mozilla/5.0... |
REMOTE_ADDR | 客戶端 IP 位址 | 192.168.1.1 |
REMOTE_PORT | 客戶端連接埠 | 54321 |
SCRIPT_FILENAME | 當前執行腳本絕對路徑 | /var/www/html/index.php |
SERVER_PORT | 伺服器監聽埠 | 80 或 443 |
REQUEST_URI | 請求 URI(含查詢字串) | /index.php?id=1 |
PHP_AUTH_USER | HTTP 認證使用者名稱(Apache 模組模式) | admin |
PHP_AUTH_PW | HTTP 認證密碼 | secret |
<?php
$url_this = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
echo $url_this; // 輸出:https://localhost/lu.php
?>
<?php
class RequestInfo {
public static function getClientIP() {
$keys = ['HTTP_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'REMOTE_ADDR'];
foreach ($keys as $key) {
if (!empty($_SERVER[$key])) {
$ips = explode(',', $_SERVER[$key]);
return trim($ips[0]);
}
}
return 'unknown';
}
public static function isAjax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH'])
&& strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest';
}
public static function isHttps() {
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| $_SERVER['SERVER_PORT'] == 443;
}
public static function getFullUrl() {
$scheme = self::isHttps() ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'];
$uri = $_SERVER['REQUEST_URI'] ?? '';
return $scheme . '://' . $host . $uri;
}
}
// 使用範例
echo "Client IP: " . RequestInfo::getClientIP() . "\n";
echo "Is AJAX: " . (RequestInfo::isAjax() ? 'Yes' : 'No') . "\n";
echo "Full URL: " . RequestInfo::getFullUrl() . "\n";
?>
HTTP_REFERER、HTTP_X_FORWARDED_FOR 等標頭可被客戶端偽造,安全敏感場景勿直接信任。$_SERVER 變數無意義或不存在。REQUEST_TIME 需 PHP 5.1.0+;$_SERVER 自 PHP 4.1.0 起可用,舊版使用 $HTTP_SERVER_VARS(非超全域)。register_globals=On(已棄用),會汙染全域命名空間,嚴重安全風險,務必關閉。HTTP_HOST)。常混淆的魔術常數與 $_SERVER 關係:
| 常數 | 說明 | 範例 |
|---|---|---|
__FILE__ | 目前檔案完整路徑(含檔名) | /var/www/html/config.php |
__DIR__ | 目前檔案所在目錄(PHP 5.3+) | /var/www/html |
__LINE__ | 目前行號 | 25 |
PHP_OS | 伺服器作業系統 | Linux |
PHP_VERSION | PHP 版本 | 8.2.10 |
善用 $_SERVER 與魔術常數,能構建健壯的路由、日誌、安全防護與多環境適配機制。建議封裝為服務類,集中管理與擴展。