PHP HTTP_HOST извлечение поддомена, учитывая, что поддомен должен быть подстановочным знаком и содержать более одного '.' - PullRequest
1 голос
/ 05 августа 2010

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

Так, например, возьмите следующие значения 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

Я предполагаю, что единственный способ сделать это - загрузить список tlds, что позволяет мне, возможно, не очень-то это делать, так как это в начале скрипта и действительно требует такой тяжелой работы. .

Ниже приведен текущий код.

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?

Ответы [ 4 ]

1 голос
/ 13 августа 2011

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

1 голос
/ 05 августа 2010

Прежде всего я бы взорвался (и использовал бы первый индекс в массиве) на слэше, чтобы быть уверенным, что строка заканчивается 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}))$

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

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

0 голосов
/ 05 августа 2010

Не придирчиво, но с технической точки зрения .co.uk - это домен второго уровня.

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

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

В Википедии имеется полный список ДВУ, как вы можете видетьони содержат только 1 «точку», за которой следует 1 «строка».

0 голосов
/ 05 августа 2010

С помощью 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   
}
...