Насколько надежен 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