2010-08-05 7 views
1

Я пытаюсь извлечь субдомен из значения HTTP_HOST. Однако я столкнулся с проблемой, когда, если в поддомене имеется более одной точки, он не подходит должным образом. Учитывая, что это сценарий для работы на нескольких разных доменах, и он может иметь неограниченное количество точек, а tld может быть либо 1 или 2 части (и любой длины) - существует ли практический способ правильного сопоставления субдомена, домена и во всех ситуациях?Выделение субдомена PHP HTTP_HOST, учитывая, что поддомен является подстановочным знаком и содержит более одного символа.

Так, например, допустим следующие значения HTTP_HOST и то, что требуется для соответствия.

  • www.buggedcom.co.uk
    • Subdomain: WWW
    • Домен: buggedcom.co.uk
    • TLD: co.uk
  • WWW. buggedcom.com
    • Subdomain: WWW
    • Домен: buggedcom.com
    • TLD: ком
  • test.buggedcom.co.uk
    • Subdomain: тест
    • Домен: buggedcom.co .uk
    • TLD: co.uk
  • test.buggedcom.com
    • Subdomain: тест
    • Домен: buggedcom.com
    • TLD: ком
  • multi.sub.test.buggedcom.co.uk
    • Поддомен: multi.sub.test
    • Домен: buggedcom.co.uk
    • TLD: co.uk
  • multi.sub.test.buggedcom.com
    • Subdomain: multi.sub.test
    • Домен: buggedcom.ком
    • TLD: ком

Я предполагаю, что единственный способ сделать это было бы загрузить список ДВУ, которые позволяют это возможно, я действительно не хочу, чтобы сделать, как это в начало сценария и должно действительно требовать такого тяжелого подъема.

Ниже приведен код.

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 добавить поддомен как ПОЛУЧИТЬ пары?

+0

Если сайт знал о своем правильном домене (в данном случае «buggedcom»), это было бы тривиально. Нет ли способа потребовать этого в каком-то файле конфигурации приложения? – bzlm

+0

cms имеет архитектуру с несколькими сайтами. Фактический URL-адрес сайта загружается из базы данных дальше по конфигурации и основывается только на хосте. Я предполагаю, что определения субдомена/tld могут быть перемещены дальше по странице. – buggedcom

ответ

1

Прежде всего, я бы взорваться (и использовать первый индекс в массиве) на слэш только в убедитесь, что строка заканчивается TLD.

Тогда я бы разрезал его preg_replace. Этот rexexp соответствует домену + tld независимо от типа tld. Опасайтесь, однако это создаст проблему с 2 & 3-буквенными доменами. Но это должно дать толчок правильного направления ....

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

Edit: как было указано: .museum также возможно, поэтому редактировал первый рисунок в TLD части ....

И, конечно, TLD, как .UK, может вести себя иначе, чем co.uk ugh .. это не так просто ...

+0

Ouch. Вы не думаете, что .info, .museum и т. Д. Имеют право на существование? :) – bzlm

+0

ой, ты совершенно прав. – Deefjuh

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

+0

oic, я думаю, вы пойдете с решением evolve тогда :) –

0

Не должно быть ничтожным, но технически говорящим .co.uk является доменом второго уровня.

.uk является «доменом верхнего уровня кода страны» в этом случае, а .co предназначен для «коммерческого использования», определенного Соединенным Королевством.

Это может не ответить на ваш вопрос.

Википедия имеет довольно complete list of TLD's, так как вы можете видеть, что они содержат только 1 "точку", за которой следует 1 "строка".

+0

Я думаю, что он отвечает на вопрос.Просто не так, как надеялся OP. :) – bzlm

+0

О да. Я знал это, извините, неверный пример. – buggedcom

1

Я думаю, что решение этой проблемы лучше обрабатываются тех, кто пытается сделать то же самое ... есть куча лучших функций синтаксического анализа URL в комментариях к PHP документации для функции parse_url, которые могли бы работать лучше: http://www.php.net/manual/en/function.parse-url.php