2013-03-28 1 views
1

Я создаю приложение, которое использует поддомены и пользовательские имена доменов, которые находятся в базе данных для пользователей, поэтому, если запрос поступает из другого домена, ll проверить из базы данных, если этот пользовательский url действительно есть или когда запрос поступает из поддомена, я проверю, есть ли это. Если это я делаю свои вещи.Лучший способ определить, был ли запрос получен из другого домена или поддомена

Рассмотрим этот простой пример я ищу:

if(is_user_request()) 
{ 
    $url = get_url(); 
    // assuming that get_url() magically decides whether to output .. 
    // a custom domain (http://domain.tld) 
    // or a subdomain's first part (eg. "this".domain.tld) 
} 
else 
{ 
    // otherwise it's not a sub domain nor a custom domain, 
    // so we're dealing with our own main site. 
} 

Теперь, прежде чем идти вперед при условии, что, потому что у меня есть 0 репы, я здесь просят «ТЕХ кодов». У меня есть полностью рабочий способ сделать это, который заключается в следующем:

// hosts 
$hosts = explode('.', $_SERVER['HTTP_HOST']); 

// if there is a subdomain and that's under our $sitename 
if(!empty($hosts[1]) AND $hosts[1] === Config::get('domain_mid_name')) 
{ 
    $url = $hosts[0]; 
    $url_custom = false; 
} 

// if there is no subdomain, but the domain is our $sitename 
elseif(!empty($hosts[0]) AND $hosts[0] === Config::get('domain_mid_name') AND !empty($hosts[1]) AND $hosts[1] !== Config::get('domain_mid_name')) 
    { 
    $url = false; 
    $url_custom = false; 
} 

// otherwise it's most likely that the request 
// came from a entirely different domain name. 
// which means it's probably $custom_site 
else 
{ 
    $url = false; 
    $url_custom = implode('.', $hosts); 
} 

if($url) 
{ 
    return $url; 
} 

if($url_custom) 
{ 
    return $url_custom; 
} 

Однако, я уверен, что есть лучший способ сделать это. Потому что, прежде всего, HTTP_HOST не включает «http: //», поэтому мне нужно добавить это вручную, и я уверен, что это все, если, иначе дело просто перебор. Итак, люди умнее меня, просветите меня, пожалуйста.

О, и нет. У меня нет предопределенных поддоменов. У меня есть простой шаблон * .domain.tld, поэтому все поддомены переходят к основному скрипту. Я просто говорю об этом, потому что из моего поиска решения я нашел множество ответов, которые предлагали вручную создать поддомен, который даже не удаленно связан с тем, что я прошу, поэтому давайте пропустим этот вопрос.

ответ

1

Как уже говорилось, $_SERVER['HTTP_HOST'] - это путь.

Но в вашем коде есть ошибки. Вы предполагаете, что отправленные имена хостов состоят из 2 или 3 компонентов, но вы не можете быть в этом уверены. Вы должны хотя бы проверить count($hosts).

Если на примере вы используете domain.tld для своего собственного сайта, тогда вам будет лучше с первой проверкой, если отправлено domain.tld (вы быстро возвращаете свою страницу); то посмотрите, substr($_SERVER['HTTP_HOST']...,-11)==='.domain.tld', и если да, верните субсайт (работает с любым уровнем субдомена, все еще быстро); иначе восстановление ошибок, так как вам был перенаправлен полностью чужой домен. Ключевым моментом является то, что совпадение доменов с верхними средствами иерархии соответствует строкам имени хоста, выровненному по правому краю:

 .domain.tld | subsite-pattern 
    sub12.domain.tld | MATCH 
    sub12.dumain.tld | NO MATCH 
    sub12domain.tld | NO MATCH 
+0

Это лучший ответ. И отметить, что скорость очень ценится. –

2

$_SERVER['HTTP_HOST'] - правильный способ сделать это, если вы не хотите передавать различные параметры со своего веб-сервера на PHP.

Что касается протокола, имейте в виду, что протокол запроса должен быть определен $_SERVER['HTTPS'], а не считать его http.

Для извлечения субдомен можно посмотреть с помощью array_shift и затем запустить

$subdomain = array_shift(explode('.', $_SERVER['HTTP_HOST'])); 

Но в целом то, что у вас есть то, как это должно быть сделано.

Смежные вопросы