Разница между HTTP_HOST и SERVER_NAME в PHP
Заголовок: В чем разница между $_SERVER['HTTP_HOST']
и $_SERVER['SERVER_NAME']
в PHP?
Описание проблемы:
Я столкнулся с вопросом о различиях между переменными $_SERVER['HTTP_HOST']
и $_SERVER['SERVER_NAME']
в PHP. Обе переменные содержат информацию о хосте, но меня интересует, в чем именно состоит их отличие и в каких случаях правильнее использовать одну из них.
Когда стоит использовать $_SERVER['HTTP_HOST']
, а когда $_SERVER['SERVER_NAME']
, и почему?
Буду признателен за ваши разъяснения и примеры использования!
5 ответ(ов)
Обратите внимание, что если вы хотите использовать IPv6, вам, вероятно, следует использовать HTTP_HOST
, а не SERVER_NAME
. Если вы введете http://[::1]/
, то переменные окружения будут следующими:
HTTP_HOST = [::1]
SERVER_NAME = ::1
Это означает, что если вы будете использовать mod_rewrite, вы можете получить нежелательный результат. Например, для перенаправления на SSL:
# SERVER_NAME НЕ будет работать - Перенаправление на https://::1/
RewriteRule .* https://%{SERVER_NAME}/
# HTTP_HOST будет работать - Перенаправление на https://[::1]/
RewriteRule .* https://%{HTTP_HOST}/
Это применимо ТОЛЬКО если вы обращаетесь к серверу без указания имени хоста.
Если вы хотите проверить информацию о сервере через файл server.php (или как вы его там назовёте), вы можете использовать следующий код:
<?php
phpinfo(INFO_VARIABLES);
?>
или
<?php
header("Content-type: text/plain");
print_r($_SERVER);
?>
После этого вам нужно зайти на этот файл, используя все действительные URL вашего сайта, и сравнить результаты. Это поможет вам увидеть различия в переменных окружения или других параметрах, которые могут зависеть от URL.
Это зависит от того, что именно вы хотите узнать. SERVER_NAME
— это имя хоста сервера, тогда как HTTP_HOST
— это виртуальный хост, к которому подключился клиент.
Переменная $_SERVER['SERVER_NAME']
основана на конфигурации вашего веб-сервера. В то время как $_SERVER['HTTP_HOST']
формируется на основе запроса от клиента.
Я долго не мог понять, что люди имели в виду под утверждением, что " SERVER_NAME
более надежен". Я использую общий сервер и не имею доступа к директивам виртуального хоста. Поэтому я использую mod_rewrite в .htaccess
, чтобы сопоставить разные HTTP_HOST
с разными директориями. В этом случае HTTP_HOST
оказывается более значимым.
Ситуация подобна и при использовании виртуальных хостов на основе имен: директива ServerName
внутри виртуального хоста просто указывает, какой хостнейм будет сопоставлен с этим виртуальным хостом. Важно то, что в обоих случаях хостнейм, предоставленный клиентом во время запроса (HTTP_HOST
), должен соответствовать имени на сервере, которое также сопоставлено с директорией. Будь то сопоставление через директивы виртуального хоста или с помощью правил mod_rewrite в .htaccess
— это второстепенно. В таких случаях HTTP_HOST
будет таким же, как и SERVER_NAME
. Я рад, что Apache настроен именно так.
Однако ситуация отличается для виртуальных хостов на основе IP. В этом случае, и только в этом случае, SERVER_NAME
и HTTP_HOST
могут быть разными, потому что теперь клиент выбирает сервер по IP, а не по имени. Действительно, могут быть особые конфигурации, где это имеет значение.
Поэтому, начиная с этого момента, я буду использовать SERVER_NAME
, на случай если мой код будет перенесен в такие особые конфигурации.
UTF-8 на всех уровнях!
Сортировка двумерного массива по значению в столбце
Что такое потокобезопасность и непотокобезопасность в PHP?
Как передать переменные и данные из PHP в JavaScript?
Вставка нового элемента в массив в любом месте в PHP