5

Разница между HTTP_HOST и SERVER_NAME в PHP

15

Заголовок: В чем разница между $_SERVER['HTTP_HOST'] и $_SERVER['SERVER_NAME'] в PHP?

Описание проблемы:

Я столкнулся с вопросом о различиях между переменными $_SERVER['HTTP_HOST'] и $_SERVER['SERVER_NAME'] в PHP. Обе переменные содержат информацию о хосте, но меня интересует, в чем именно состоит их отличие и в каких случаях правильнее использовать одну из них.

Когда стоит использовать $_SERVER['HTTP_HOST'], а когда $_SERVER['SERVER_NAME'], и почему?

Буду признателен за ваши разъяснения и примеры использования!

5 ответ(ов)

0

Обратите внимание, что если вы хотите использовать 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}/

Это применимо ТОЛЬКО если вы обращаетесь к серверу без указания имени хоста.

0

Если вы хотите проверить информацию о сервере через файл server.php (или как вы его там назовёте), вы можете использовать следующий код:

<?php
    phpinfo(INFO_VARIABLES);
?>

или

<?php
    header("Content-type: text/plain");

    print_r($_SERVER);
?>

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

0

Это зависит от того, что именно вы хотите узнать. SERVER_NAME — это имя хоста сервера, тогда как HTTP_HOST — это виртуальный хост, к которому подключился клиент.

0

Переменная $_SERVER['SERVER_NAME'] основана на конфигурации вашего веб-сервера. В то время как $_SERVER['HTTP_HOST'] формируется на основе запроса от клиента.

0

Я долго не мог понять, что люди имели в виду под утверждением, что " 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, на случай если мой код будет перенесен в такие особые конфигурации.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь