首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 取得網域名稱的四種實用方法

     編輯:PHP 綜合知識

場景

從完整 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
?>

最佳實務建議

  1. 解析外部 URL 字串 → **parse_url()** 首選。
  2. 2. 取得當前站點網域 → **$_SERVER['HTTP_HOST']**(注意連接埠)。 3. 需移除 www. 等子網域 → 使用 Public Suffix List 庫(如 TLDExtract)。 4. 安全敏感場景(如 CSRF Token 綁定網域) → 僅信任伺服器端設定常數,不可信任客戶端傳遞的 Host。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved