開發中頻繁需要獲取當前腳本路徑、項目根目錄、域名等信息。PHP 通過 $_SERVER 超全局數組與魔術常量提供豐富信息,但各變量含義易混淆。本文整理最常用變量、輸出示例與實戰取舍建議。
| 變量/常量 | 含義 | 示例輸出 | 注意事項 |
|---|---|---|---|
$_SERVER['DOCUMENT_ROOT'] | Web 服務器文檔根目錄(Apache DocumentRoot) | /usr/opt/apache2/htdocs/ | 受 httpd.conf 配置影響,符號鏈接可能不解析 |
$_SERVER['PHP_SELF'] | 當前腳本相對文檔根目錄的路徑 | /alias/aa.php | 包含查詢字符串時需配合 $_SERVER['REQUEST_URI'] |
__FILE__ | 當前文件的絕對文件系統路徑(含文件名) | /usr/opt/apache2/htdocs/kamap/aa.php | 魔術常量,編譯時解析,包含符號鏈接真實路徑 |
dirname(__FILE__) | 當前文件所在目錄絕對路徑 | /usr/opt/apache2/htdocs/kamap/ | PHP 5.3+ 推薦用 __DIR__ |
realpath($path) | 解析相對路徑為絕對路徑(去除 ..、符號鏈接) | /usr/etc/abcd | 路徑必須存在,否則返回 false |
$_SERVER['REQUEST_URI'] | 請求的完整 URI(含查詢串) | /alias/aa.php?id=1 | 最直觀反映用戶訪問地址 |
$_SERVER['HTTP_HOST'] | 請求頭 Host(域名:端口) | example.com:8080 | 反向代理下可能需看 X-Forwarded-Host |
$_SERVER['HTTPS'] | 是否 HTTPS(on/off 或 1/0) | on | 反代下需判斷 X-Forwarded-Proto |
<?php
function getCurrentFullUrl() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
$host = $_SERVER['HTTP_HOST'];
$uri = $_SERVER['REQUEST_URI'];
return $protocol . '://' . $host . $uri;
}
function getBaseUrl() {
$protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? 'https' : 'http';
return $protocol . '://' . $_SERVER['HTTP_HOST'] . dirname($_SERVER['SCRIPT_NAME']);
}
?>
__DIR__ . '/config.php'(不受調用腳本位置影響)。$_SERVER['REQUEST_URI'] 或 getBaseUrl()。$_SERVER['REQUEST_URI'] 的 path 部分。$_SERVER['HTTP_REFERER'] 或 HTTP_ORIGIN,但不可全信(可偽造)。<?php
echo '<pre>';
print_r($_SERVER);
echo '</pre>';
// 或僅查看關鍵項
$keys = ['DOCUMENT_ROOT', 'PHP_SELF', 'REQUEST_URI', 'SCRIPT_NAME', 'SCRIPT_FILENAME', 'HTTP_HOST', 'HTTPS', 'SERVER_PORT', 'QUERY_STRING'];
foreach ($keys as $k) {
echo "$k = " . ($_SERVER[$k] ?? '未設置') . "<br>";
}
?>