在不同伺服器環境(Apache、Nginx、IIS、CGI、CLI)中,$_SERVER 變數的可用性與命名可能不同。本文提供一個相容性極佳的封裝函數 PMA_getenv(),並示範如何安全取得 HTTP_HOST。
function PMA_getenv($var_name) {
// 1. 優先從 $_SERVER 取得
if (isset($_SERVER[$var_name])) {
return $_SERVER[$var_name];
}
// 2. 嘗試 $_ENV
elseif (isset($_ENV[$var_name])) {
return $_ENV[$var_name];
}
// 3. 嘗試 getenv() 函數
elseif (getenv($var_name)) {
return getenv($var_name);
}
// 4. Apache 模組專用:apache_getenv()
elseif (function_exists('apache_getenv') && apache_getenv($var_name, true)) {
return apache_getenv($var_name, true);
}
// 5. 以上皆無則返回空字串
return '';
}
if (empty($HTTP_HOST)) {
if (PMA_getenv('HTTP_HOST')) {
$HTTP_HOST = PMA_getenv('HTTP_HOST');
} else {
$HTTP_HOST = '';
}
}
// 使用 htmlspecialchars 防止 XSS
echo htmlspecialchars($HTTP_HOST);
若僅需支援現代環境,可簡化為:
$host = $_SERVER['HTTP_HOST'] ?? $_SERVER['SERVER_NAME'] ?? '';
echo htmlspecialchars($host);
注意:SERVER_NAME 需在 Apache 設定 UseCanonicalName On 時可靠;反向代理下建議優先信任 HTTP_X_FORWARDED_HOST(需驗證來源)。