Разница между 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 на всех уровнях!
Как ограничить использование API на моем сайте?
Узнайте, как PHP работает на сервере (CGI, FastCGI или mod_php)
Функции startsWith() и endsWith() в PHP
Как получить расширение файла в PHP?