2010-08-05 33 views
1

我想從HTTP_HOST值中提取子域。然而,我偶然發現一個問題,如果子域中有多個點,它就無法正確匹配。鑑於這是一個在多個不同域上運行的腳本,並且它可以有無限的點數,並且tld可以是1或2個部分(以及任何長度) - 是否有一種正確匹配子域,域的實用方法在所有情況下tld?假設一個子域是一個通配符幷包含多個'。',PHP HTTP_HOST子域提取。

因此,例如,採取以下HTTP_HOST值和需要匹配的內容。

  • www.buggedcom.co.uk
    • 子域:WWW
    • 域:buggedcom.co.uk
    • TLD:co.uk
  • WWW。 buggedcom.com
    • 子域:WWW
    • 域:buggedcom.com
    • TLD:COM
  • test.buggedcom.co.uk
    • 子域:測試
    • 域:buggedcom.co .uk
    • TLD:co.uk
  • test.buggedcom.com
    • 子域:測試
    • 域:buggedcom.com
    • TLD:COM
  • multi.sub.test.buggedcom.co.uk
    • 子域:multi.sub.test
    • 域:buggedcom.co.uk
    • TLD:co.uk
  • multi.sub.test.buggedcom.com
    • 子域:multi.sub.test
    • 域: buggedcom。COM
    • TLD:COM

我假設,要做到這一點的唯一方法是先裝載頂級域名的列表,這讓可能我真的不希望這樣做,因爲這是在一個腳本的開始,應該真的需要像這樣的繁重工作。

以下是當前的代碼。

define('HOST', isset($_SERVER['HTTP_HOST']) === true ? $_SERVER['HTTP_HOST'] : (isset($_SERVER['SERVER_ADDR']) === true ? $_SERVER['SERVER_ADDR'] : $_SERVER['SERVER_NAME'])); 
$domain_parts = explode('.', HOST); 
$domain_parts_count = count($domain_parts); 
if($domain_parts_count > 1) 
{ 
    $sub_parts = array_splice($domain_parts, 0, $domain_parts_count-3); 
    define('SUBDOMAIN', implode('.', $sub_parts)); 
    unset($sub_parts); 
} 
else 
{ 
    define('SUBDOMAIN', ''); 
} 
define('DOMAIN', implode('.', $domain_parts)); 
var_dump($domain_parts, SUBDOMAIN, DOMAIN);exit; 

只要想到能mod_rewrite的追加子域作爲GET PARAM?

+0

如果網站知道其正確的域名(在這種情況下,「buggedcom」),這將是微不足道的。有沒有辦法在某種應用程序配置文件中要求這個? – bzlm 2010-08-05 13:23:18

+0

該cms具有多站點體系結構。實際的站點URL將從配置中進一步下載到數據庫中,並且僅基於主機。我想子域/ tld的定義可以進一步向下移動頁面。 – buggedcom 2010-08-05 13:47:04

回答

1

首先我會爆炸的(和使用數組中的第一個索引)上只是一個斜槓請確保該字符串以TLD結尾。

然後我會用preg_replace剪下它。 無論tld類型如何,rexexp都匹配域+ tld。但是請注意,這會給3個字母的域帶來問題。但它應該給推到正確的方向....

[a-zA-Z0-9]+\.(([a-zA-Z]{2,6})|([a-zA-Z]{2,3}\.[a-zA-Z]{2,3}))$ 

編輯:爲指出:.museum也是可以的,所以編輯在TLD部分的第一圖案....

當然TLD就像.UK可能會有不同的表現,那麼co ..呃 呃..不是那麼容易......

+0

哎。你不認爲.info,.museum等有權存在? :) – bzlm 2010-08-05 13:19:04

+0

哎喲,你是完全正確的。 – Deefjuh 2010-08-05 13:20:38

0

用的preg_match,你可以一次過提取的子域名和TLD部分,像這樣:

function get_domain_parts($domain) { 
    $parts = array(); 
    $pattern = "/(.*)\.buggedcom\.(.*)/"; 
    if (preg_match($pattern, $domain, $parts) == 1) { 
     return array($parts[1], $parts[2]); 
    } else { 
     return FALSE; 
    } 
} 

$result = get_domain_parts("multi.sub.test.buggedcom.co.uk"); 
if ($result) { 
    echo($result[0] . " and " . $result[1]); // multi.sub.test and co.uk 
} 
+0

,因爲這不會在明確的域名上運行,所以我無法檢查任何內容。此外,它在基礎URL中的配置加載之前運行,以實現各種優化/緩存原因。 – buggedcom 2010-08-05 13:20:08

+0

oic,我想你會去evolve的解決方案:) – 2010-08-05 13:25:01

0

不是很挑剔,但從技術上說.co.uk是二級域名。

.uk在這種情況下是「國家/地區代碼頂級域名」,而.co是由英國定義的「商業用途」。

雖然這可能不會回答你的問題。

維基百科擁有漂亮的complete list of TLD's,正如您所看到的,它們只包含1個「點」,後面跟着1個「字符串」。

+0

我認爲它回答了這個問題。只是不像OP希望的那樣。 :) – bzlm 2010-08-05 13:21:25

+0

噢。我確實知道,對不起,不正確的例子。 – buggedcom 2010-08-05 13:49:53