從完整 URL 中解析出主機名(如 www.example.com),常用於多站點識別、安全驗證、連結正規化。
$_SERVER['HTTP_HOST'](當前請求)<?php
// 僅適用於取得「目前請求」的網域
echo $_SERVER['HTTP_HOST']; // 例:www.example.com:8080
// 注意:包含連接埠,且受 Proxy/負載平衡器影響,可能非原始 Host
?>
parse_url() 內建函數(標準推薦)<?php
$url = 'https://www.example.com/path?query=1#fragment';
$parts = parse_url($url);
echo $parts['host']; // www.example.com
// 完整回傳結構
print_r($parts);
/*
Array
(
[scheme] => https
[host] => www.example.com
[path] => /path
[query] => query=1
[fragment] => fragment
)
*/
?>
<?php
function extractDomain(string $url): string {
// 移除協議
$url = preg_replace('#^https?://#i', '', $url);
// 取第一個 / 之前
$pos = strpos($url, '/');
return $pos === false ? $url : substr($url, 0, $pos);
}
echo extractDomain('https://sub.example.com:8080/path'); // sub.example.com:8080
echo extractDomain('https://example.com'); // example.com
?>
<?php
$url = 'https://www.example.com/path';
preg_match('#^https?://([^/]+)#i', $url, $matches);
echo $matches[1]; // www.example.com
?>
| 方法 | 效能 | 適用場景 | 備註 |
|---|---|---|---|
$_SERVER['HTTP_HOST'] | 極快 | 當前請求網域 | 含連接埠,僅限當前 HTTP 請求 |
parse_url() | 快 | 解析任意 URL 字串 | 標準庫、正確處理 IPv6、認證資訊、連接埠 |
| 自訂函數 | 中 | 簡單提取、無擴展環境 | 邏輯簡單,需自行處理邊界情況 |
| 正則 | 較慢 | 一次性腳本、複雜模式匹配 | 過度設計,維護成本高 |
<?php
function getRootDomain(string $host): string {
$parts = explode('.', $host);
// 簡易規則:取最後兩段(不適用 .co.uk 等多級後綴)
// 生產環境建議使用 Public Suffix List 庫
return count($parts) >= 2 ? implode('.', array_slice($parts, -2)) : $host;
}
echo getRootDomain('api.v2.shop.example.com'); // example.com
echo getRootDomain('example.com'); // example.com
?>
parse_url()** 首選。$_SERVER['HTTP_HOST']**(注意連接埠)。
3. 需移除 www. 等子網域 → 使用 Public Suffix List 庫(如 TLDExtract)。
4. 安全敏感場景(如 CSRF Token 綁定網域) → 僅信任伺服器端設定常數,不可信任客戶端傳遞的 Host。