我编写了一个 PHP 脚本,我想在同一台服务器上的多个域上使用它(指向同一个脚本)。我想为脚本添加功能,以便随时找出脚本正在使用的域。HTTP_HOST 可用于查找域,但是,我读到它不可靠,尤其是在旧浏览器中。我的理解是大多数 Apache 服务器都使用虚拟主机,它们无论如何都使用相同的方法,所以如果它不是托管服务提供商的问题,那么它不应该是我的代码的问题。
任何人都可以验证这一点并消除混乱吗?
HTTP_HOST
用于Host:
HTTP 1.1 用户代理在请求期间发送的标头。HTTP 1.0 客户端不使用它,因此它不会出现。但是,如今,我认为 HTTP 1.0 客户端仍然不多。
编辑:我已更正:HTTP 1.0 请求中不存在 HOST 标头。请参阅@Bruno 的回答。出于安全考虑,将矿井留在原地
我知道的 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"]);
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 的浏览器无法访问共享服务器上的任何网站。共享主机上有很多网站。通过使用 HTTP_HOST var,子域也可能(虽然不确定)以相同的方式“检测到”。
读完这些后,我真的不认为现在有人使用过旧的浏览器,他们不可能真正浏览网络:)
这是我在类似问题中回答的:
出于其他目的,我自己对此进行了调查:
“在配置为使用代理时,代理、一些移动客户端和 IE 正在使用 HTTP/1.0。所以 1.0 似乎仍然占整个网络流量的不小的百分比。......是的,有很多1.0 客户端仍然存在。”
资料来源(2009 年 7 月):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