Извлечение субдомена PHP HTTP_HOST, учитывая, что субдомен быть подстановочным знаком и содержать больше чем один '.'

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

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

1
задан buggedcom 5 August 2010 в 12:58
поделиться

3 ответа

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

И, конечно, такие ДВУ, как .UK, могут вести себя иначе, чем co.uk. Уф... это не так просто...

1
ответ дан 2 September 2019 в 22:24
поделиться

С помощью 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
ответ дан 2 September 2019 в 22:24
поделиться

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

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

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

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

0
ответ дан 2 September 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: