it-swarm.com.ru

Получить текущий домен

У меня есть мой сайт на сервере 

http://www.myserver.uk.com

Для этого у меня есть два домена:

http://one.com

а также 

http://two.com

я хотел бы получить с PHP текущий домен, но если я использую $_SERVER['HTTP_Host'], то это покажет мне 

myserver.uk.com

вместо:

one.com or two.com

Как я могу получить домен, а не имя сервера? У меня есть PHP версия 5.2

108
Tony Evyght

попробуйте использовать это: $_SERVER['SERVER_NAME']

или разобрать 

$_SERVER['REQUEST_URI']

Правка:

Apache_request_headers ()

147
onehalf

Лучшее использование будет 

echo $_SERVER['HTTP_Host'];

И можно использовать как это

if(strpos( $_SERVER['HTTP_Host'], 'banana.com') !== false){
    echo "Yes this is indeed the banana.com domain";
}

Приведенный ниже код является хорошим способом просмотра всех переменных в $ _SERVER в структурированном HTML-выводе с выделенными ключевыми словами, который останавливается непосредственно после выполнения. Поскольку я иногда забываю, какой из них использовать сам - я думаю, что это может быть изящно. 

<?php 
// change banana.com to the domain you were looking for.. 
$wordToHighlight= "banana.com";
$serverVarHighlighted = str_replace( $wordToHighlight, '<span style=\'background-color:#883399; color: #FFFFFF;\'>'. $wordToHighlight .'</span>',  $_SERVER );
echo "<pre>";
print_r( $serverVarHighlighted );
echo "</pre>";
exit();
?>
46
K. Kilian Lindberg

Использование $_SERVER['HTTP_Host'] возвращает меня (поддомен.) Maindomain.extension. Похоже, самое простое решение для меня.

Правка: если вы на самом деле «перенаправляете» через iFrame, вы можете добавить параметр get, который указывает домен.

<iframe src="myserver.uk.com?domain=one.com"/>

И тогда вы можете установить переменную сеанса, которая сохранит эти данные в вашем приложении.

39
Raz0rwire

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

Неправильный путь:

$_SERVER['HTTP_Host']

Это получает домен из заголовков запроса, который открыт для манипуляций хакерами , и может привести к отравлению кэша.

$_SERVER['SERVER_NAME']

Параметр Apache по умолчанию имеет usecanonicalname off, что заполняет $_SERVER['SERVER_NAME'] тем же заголовком, который $_SERVER['HTTP_Host'] использовал бы в любом случае (плюс порт). Вот несколько вредоносных примеров . Если usecanonicalname включено, то это более безопасно, но я не знаю, работает ли этот тип конфигурации в большинстве сред.

Предостережения:

  • Если имя_сервера не может быть разрешено, вместо имени используется команда hostname операционной системы [source] .
  • Redhat по умолчанию включает usecanonical [ source ].
  • Если заголовок Host пропущен, сервер будет вести себя так, как если бы usecanonical .__ был включен [source] .

Правильный путь:

Единственный гарантированный безопасный метод - хранить домен там, где вы можете получить к нему доступ.

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

 + ---------------------------------------------- + ------------------------ + 
 | Безопасные методы хранения текущего домена | По умолчанию/рекомендуется в | 
 + ----------------------------------------- ----- + ------------------------ + 
 | Конфиг файл | Joomla, Drupal/Symfony | 
 | База данных | WordPress | 
 | Экологическая переменная | Laravel | 
 | Сервисный реестр | Kubernetes DNS | 
 + ------------------------------------------- --- + ------------------------ + 

Для пользователей WordPress:

Если вы используете WordPress, вы можете безопасно получить домен следующим образом:

$urlparts = parse_url(home_url());
$domain = $urlparts['Host'];

(Но если вы создаете URL в WordPress, просто используйте home_url или site_url , или любую из других функций URL .)


7
Mr. Me

Попробуйте $_SERVER['SERVER_NAME']. Советы: создайте файл PHP, который вызывает функцию phpinfo(), и просмотрите раздел «Переменные PHP». Есть куча полезных переменных, о которых мы никогда не думали.

6
flowfree

Поздний ответ, но здесь это идет:

$currentDomain = preg_replace('/www\./i', '', $_SERVER['SERVER_NAME']);

Это даст вам чистое доменное имя, без www

4
Pedro Lobito

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

Правка: Кроме того, пожалуйста, смотрите мой комментарий ниже, чтобы увидеть, к чему это приведет.

Это важно при определении, отправлять ли вызовы Ajax с "www" или без:

$.ajax("url" : "www.site.com/script.php", ...

$.ajax("url" : "site.com/script.php", ...

При отправке вызова Ajax доменное имя должно совпадать с именем в адресной строке браузера, в противном случае у вас будет Uncaught SecurityError в консоли.

Поэтому я придумала это решение для решения этой проблемы:

<?php
    substr($_SERVER['SERVER_NAME'], 0, 3) == "www" ? $WWW = true : $WWW = false;

    if ($WWW) {
        /* We have www.example.com */
    } else {
        /* We have example.com */
    }
?>

Затем, в зависимости от того, является ли $ WWW истиной или ложью, запустите правильный вызов Ajax.

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

3
InfiniteStack

извините за поздний ответ, все используют функцию parse_url, но иногда пользователь может передать аргумент в другом формате

чтобы исправить, что я создал Finction проверить это

function fixDomainName($url='')
    {
        $strToLower = strtolower(trim($url));
        $httpPregReplace = preg_replace('/^http:\/\//i', '', $strToLower);
        $httpsPregReplace = preg_replace('/^https:\/\//i', '', $httpPregReplace);
        $wwwPregReplace = preg_replace('/^www\./i', '', $httpsPregReplace);
        $explodeToArray = explode('/', $wwwPregReplace);
        $finalDomainName = trim($explodeToArray[0]);
        return $finalDomainName;
    }

просто передайте URL и получите домен Например 

echo fixDomainName('https://stackoverflow.com');

вернет результат будет

stackoverflow.com

и в какой-то ситуации 

echo fixDomainName('stackoverflow.com/questions/id/slug');

и он также вернет stackoverflow.com

Надеюсь, поможет

0
Manojkiran.A