Удалить поддомен из $ _SERVER ['SERVER_NAME'] - PullRequest
7 голосов
/ 16 марта 2011

Мне нужно создать сценарий, в котором он будет удалять поддомен из $ _SERVER ['SERVER_NAME'], чтобы использовать его в доменной опции функции setcookie, чтобы разрешить доступ к cookie во всех возможных поддоменах.

Например, допустим, у меня есть

function strip_out_subdomain($domain)
{
    //do something to remove subdomain
    return $only_my_domain;
}
$domain = strip_out_subdomain($_SERVER['SERVER_NAME']);
setcookie('mycookie', '123', time()+3600, '/', $domain);

Основная проблема в том, что я не знаю шаблон для моего домена. Это может быть что-то вроде:

  • www.mydomain.com
  • subdomain.mydomain.com
  • subdo.mydo.co
  • subdo.subdo.mydomain.com
  • subdo.subdo.mydo.co.uk
  • и т.д.

Спасибо

Stephanie

Ответы [ 4 ]

4 голосов
/ 16 марта 2011

Это стиль регулярного выражения для удаления части поддомена из полного доменного имени.

The

. * * * 1006

Оператор

делает сопоставление с подстановочным знаком несвязным, чтобы оно совпадало с первой точкой.

function strip_out_subdomain($domain)
{
    $only_my_domain = preg_replace("/^(.*?)\.(.*)$/","$2",$domain);
    return $only_my_domain;
}
3 голосов
/ 16 марта 2011

Можно ли определить переменную в конфигурации сервера (httpd.conf, .htaccess)? Это требует немного дополнительного начального администрирования, но, по крайней мере, может быть сделано в центральном месте.

Мне удалось установить переменную в Apache

SetEnv MY_DOMAIN mydomain.com

которые могут быть использованы в PHP:

$_SERVER['MY_DOMAIN']
2 голосов
/ 24 ноября 2012

Вы можете запросить службу Alexa с помощью cURL и извлечь имя хоста без субдомена:

function hostname($domain) {

$querystring = 'http://xml.alexa.com/data?cli=10&dat=nsa&ver=quirk-searchstatus&uid=19700101000000&userip=127.0.0.1&url='.urlencode($domain);
$ch = curl_init();
$user_agent = $_SERVER['HTTP_USER_AGENT'];
curl_setopt ($ch, CURLOPT_URL, $querystring);
curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent);
curl_setopt ($ch, CURLOPT_HEADER, 1);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_TIMEOUT, 120);
$data= curl_exec($ch);
curl_close($ch);

preg_match('/\<POPULARITY URL="(.*?)" TEXT="(.*?)" SOURCE="(.*?)"\/\>/Ui',$data,$extract);
$hostname = str_replace('/', '', $extract[1]);

return($hostname);
}
1 голос
/ 19 мая 2016

Я знаю, что это годы спустя, но почему бы не пойти так:

$dom='a.b.c.d.co.jp';
$sub=preg_replace("/.*?([^\.]+)(\.((co\.\w+)|\w+))$/i",'\1\2',$dom); //strip subdomains

это печатает d.co.jp

, где .*?([^\.]+)(\.((co\.\w+)|\w+))$ будет означать:

.*? Ленивый (поэтому он не захватывает основной домен) соответствует всем символам до тех пор, пока не последует

([^\.]+) соответствует группе символов, которые не содержат точку (т. Е. Основной домен или домен следующего сверху) ( + , обеспечивающий наличие хотя бы один символ класса) и верните его позже \ 1

(\.((co\.\w+)|\w+)) сопоставить TLD с предыдущей точкой, будь то .co. что-то или . что-то и вернуть через \ 2 ; знак плюс делает то же самое здесь

$ привязать все к концу строки, чтобы мы могли пройти весь путь от TLD влево до частей поддоменов, независимо от их количества

P.S. Я не знаю, есть ли другие TLD, состоящие из двух частей, но они также могут быть добавлены. Быстрый пробежка по https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains говорит мне, что нет, но если они есть, я думаю, что они не так уж и велики.

...