HTTP_HOST的可靠性如何?

时间:2010-11-04 11:26:47

标签: php apache http-host

我编写了一个PHP脚本,我想在同一台服务器上的几个域上使用(指向相同的脚本)。我想为脚本添加功能,以便我可以随时找出脚本正在使用哪个域。 HTTP_HOST可用于查找域,但是,我已经读过它不可靠,特别是对于旧浏览器。我的理解是大多数Apache服务器都使用相同的方法使用相同的方法,所以如果它不是主机提供商的问题,它应该不是我的代码的问题。

任何人都可以验证这一点并清除混淆吗?

5 个答案:

答案 0 :(得分:10)

HTTP_HOST用于HTTP 1.1用户代理在请求期间发送的Host:标头。 HTTP 1.0客户端不使用它,因此它不会出现。但是,现在,我认为还没有很多HTTP 1.0客户端。

答案 1 :(得分:9)

  

编辑:我更正了:HTTP 1.0请求中不存在HOST标头。见@ Bruno的回答。出于安全考虑,将我的工作留在原地

我所知道的HTTP_HOST的唯一问题是安全问题,而不是兼容问题。

安全问题源于用户发送HTTP_HOST这一事实。如果Web服务器设置不正确和/或错误,则可以将任意HTTP_HOST值用于您的站点/脚本(有关详细讨论,请参阅here)。您的应用程序需要为此做好准备。

永远不要相信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"]);

答案 2 :(得分:1)

Pekka的答案似乎更有趣,但似乎你想知道哪些浏览器支持http 1.1,哪些不支持。 在谷歌找到了这个:http://www.1-script.com/forums/Browser-Support-for-HTTP-1-1-article34982--8.htm

来自该主题的一条说明:“HTTP 1.0浏览器无法访问非默认虚拟主机。” 这意味着,据我所知,不支持http 1.1的浏览器无法访问共享服务器上的任何网站。 Thare在共享主机上有很多网站。此外,通过使用HTTP_HOST变量,子域可能(不确定)以相同的方式被“检测到”。

阅读完这些内容之后,我真的不认为有人使用过时的浏览器,他们实际上无法浏览网页:)

答案 3 :(得分:0)

这是我在similar question中回答的问题:


为了其他目的而自己调查:

  

“代理,某些移动客户端和IE时正在使用HTTP / 1.0       配置为使用代理。所以1.0似乎仍然占非       整体而言,网络流量的百分比很小。       ...       是的,那里还有很多1.0客户。“

来源(2009年7月):http://groups.google.com/group/erlang-programming/msg/08f6b72d5156ef74

: - (


我个人在我的网站上收到了很多HTTP / 1.0请求,缺少HTTP_HOST: - (

答案 4 :(得分:0)

这是我偶然发现的旧帖子,而我给出的解决方案是:

我创建了一个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