我想從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?
如果網站知道其正確的域名(在這種情況下,「buggedcom」),這將是微不足道的。有沒有辦法在某種應用程序配置文件中要求這個? – bzlm 2010-08-05 13:23:18
該cms具有多站點體系結構。實際的站點URL將從配置中進一步下載到數據庫中,並且僅基於主機。我想子域/ tld的定義可以進一步向下移動頁面。 – buggedcom 2010-08-05 13:47:04