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

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

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

Ответ 1

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

или parse

$_SERVER['REQUEST_URI']

EDIT:

apache_request_headers()

Ответ 2

Лучше всего использовать

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();
?>

Ответ 3

Использование $_SERVER['HTTP_HOST'] получает меня (субдомен.) maindomain.extension. Кажется, это самое легкое решение для меня.

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

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

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

Ответ 4

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

Вы можете использовать следующее, но они небезопасны

$_SERVER['HTTP_HOST']

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

$_SERVER['SERVER_NAME']

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

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

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

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

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

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

+----------------------------------------------+------------------------+
| Secure Methods of Storing The Current Domain | Default/Recommended In |
+----------------------------------------------+------------------------+
| Config file                                  | Joomla, Drupal/Symfony |
| Database                                     | WordPress              |
| Environmental variable                       | Laravel                |
| Service registry                             | Kubernetes DNS         |
+----------------------------------------------+------------------------+

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

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

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

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


Ответ 5

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

Ответ 6

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

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

Это даст вам чистую доменную зону без www

Ответ 7

Я знаю, что это может быть не совсем по этому вопросу, но, по моему опыту, я нахожу сохранение 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 истинным или false, выполните правильный вызов Ajax.

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

Ответ 8

Извините за поздний ответ, все используют функцию 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

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

Ответ 9

Просто попробуйте:

echo apache_request_headers()[3];