Насколько надежен HTTP_HOST?

Я написал PHP-скрипт, который я хотел бы использовать в нескольких доменах на одном сервере (указывая на один и тот же скрипт). Я хочу добавить функциональность в скрипт, чтобы в любой момент узнать, с каким доменом работает скрипт. HTTP_HOST может использоваться для поиска домена, однако я читал, что он ненадежен, особенно в старых браузерах. Насколько я понимаю, большинство серверов Apache используют виртуальные хосты, которые в любом случае используют один и тот же метод, поэтому, если это не проблема с хостинг-провайдерами, это не должно быть проблемой с моим кодом.

Может кто-нибудь проверить это и устранить путаницу?

4 ответа

Решение

HTTP_HOST для Host: заголовок, отправляемый пользовательскими агентами HTTP 1.1 во время запроса. Это не используется клиентами HTTP 1.0, поэтому не будет отображаться. Однако, в настоящее время, я не думаю, что все еще много клиентов HTTP 1.0.

Редактировать: Я исправлен: заголовок HOST отсутствует в запросах HTTP 1.0. Смотрите ответ @ Бруно. Оставляя шахту на месте из соображений безопасности

Единственные проблемы с HTTP_HOST, о которых я знаю, это проблемы безопасности, а не проблемы совместимости.

Проблемы безопасности связаны с тем, что HTTP_HOST отправлено пользователем. Если веб-сервер неправильно настроен и / или глючит, произвольно HTTP_HOST значения могут попасть на ваш сайт / скрипт (см., например, здесь для подробного обсуждения). Ваше заявление должно быть подготовлено для этого.

Никогда не стоит доверять HTTP_HOST (например, может быть хорошей идеей установить массив допустимых значений для него перед обработкой в ​​вашем PHP-скрипте):

<?php
  $allowed_hosts = array("domain1.com", "domain2.com", "domain3.com");

  if (!in_array(strtolower($_SERVER["HTTP_HOST"]), $allowed_hosts))
   die ("Unknown host name ". $_SERVER["HTTP_HOST"]);

Ответ Пекки кажется более интересным, но кажется, что вы хотите знать, какие браузеры поддерживают http 1.1, а какие нет. Нашел это в Google: http://www.1-script.com/forums/Browser-Support-for-HTTP-1-1-article34982--8.htm

Примечание из этого потока: "браузер HTTP 1.0 не может получить доступ к виртуальному хосту не по умолчанию". Это означает, что браузер, который не поддерживает http 1.1, насколько мне известно, не может получить доступ к любому веб-сайту на общем сервере. Есть много сайтов на общих хостах. Также субдомены могут быть (хотя и не уверены) "обнаружены" таким же образом, с помощью HTTP_HOST var.

Прочитав их, я действительно не думаю, что кто-то использует браузер, который в наши дни является старым, для них было бы невозможно на самом деле ориентироваться в Интернете:)

Это то, что я ответил на аналогичный вопрос:


Глядя на это сам для других целей:

"HTTP/1.0 используется прокси-серверами, некоторыми мобильными клиентами и IE, когда он настроен на использование прокси-сервера. Таким образом, 1.0, по-видимому, по-прежнему составляет нетривиальный% трафика в сети в целом.... Да, есть много 1.0 клиентов все еще там."

Источник (июль 2009 года): http://groups.google.com/group/erlang-programming/msg/08f6b72d5156ef74

:-(


Лично я получаю довольно много запросов HTTP/1.0 на мои сайты с отсутствующим HTTP_HOST:-(

Это старый пост, на который я наткнулся, и решение, которое я дал, таково:

Я создал файл JSON (в моем коде широко используются те, которые я называю токенами), чтобы стать единственным источником истины и одновременно быть открытым для модификаций от того, кто знает, какие новые вещи появятся в приложении / фреймворке:

// accounttoken.json
{
    "site": {
        "email": "admin@email.com",
        "password": "Bty1!",
        "firstname": "John",
        "secondname": "Doe",
        "country": "USA",
        "username": "Admin",
        "role": "admin",
        "protocol": "http://",
        "domain": "a9623c7ca853.eu.ngrok.io",
        "site_key": "fgRt4%$x!0($DqJi",
        "language": "en"
    },
    "google": {
        "client_id": "51965.apps.googleusercontent.com",
        "client_secret": "8Kz"
    },
    "db_mysql": {
        "db_port": 3306,
        "db_user": "<user>"
    },
// more entries here...
}

Теперь все, что вам нужно сделать, это просмотреть свои записи в одном файле:

// find php executable
cent$ whereis php
php: /usr/bin/php7.0 /usr/bin/php /usr/lib/php /etc/php /usr/include/php ...

// start interactive shell
cent$ /usr/bin/php7.0 -a

php > $json = file_get_contents('accounttoken.json');
php > $json = json_decode($json, true);
php > echo('Your domain is: ' . $json['site']['domain']);
php > echo('The site url is: ' . $json['site']['protocol'] . $json['site']['domain']);
php > quit
Другие вопросы по тегам