我的 php 页面有大量流量,但没有设置变量
$_SERVER['HTTP_HOST']
。
此流量相当于每秒 1 次点击。我不知道它可能是什么,但为了减少服务器负载,我在每个 php 页面的顶部都这样做:
if (!isset($_SERVER['HTTP_HOST']))
exit;
你知道是什么原因造成的吗?未设置
HTTP_HOST
时退出是否安全?
普通用户不设置
HTTP_HOST
可以访问我的页面吗?
嗯,可能也是“apache 虚拟连接”。检查“内部虚拟连接”的访问日志,这些是apache主进程用来向他的子进程发送命令的(比如自杀,或者我们需要重新加载conf)。这些连接是在 HTTP/1.0 中建立的,没有设置 HOST。
http://wiki.apache.org/httpd/InternalDummyConnection
这些 #$!"#sh#f#ck*$! 连接在那里产生了很多错误(缓存内容、没有 HTTP/1.1 等)。一个“简单”的解决方案是没有基于主机名的 Virtuahost 服务您的主应用程序作为默认虚拟主机。保留一个非常简单的默认虚拟主机,其中包含“它可以工作”页面,或者非常简单的内容“如果您获得此页面,您可能会尝试在某处获取支持 HTTP/1.1 的浏览器”,作为静态那么所有 HTTP/1.0 流量或仅通过 IP 访问您服务器的人都不会出现在您的真实应用程序中。
为了完整起见,我今年看到一家公司使用不良代理从所有传出 HTTP 流量中删除主机标头。但这些坏人都是蠢货,我不认为还有很多人还在没有主机的情况下浏览 HTTP/1.0。
HTTP_HOST
是客户端 HTTP 请求的一部分,指定请求将定向到哪个主机名。有必要在多站点设置中区分正确的站点。
如果未设置
HTTP_HOST
,则客户端要么非常非常旧(HTTP 1.0 不支持 HTTP_HOST),要么直接向您网站的 IP 发出请求。
我看不出像你那样阻止它有什么坏处。但是,如果您担心流量问题,那么在 Web 服务器级别解决此问题可能会更明智。
如果您在 Nginx 版本 1.25 或 1.26 中使用 HTTP/3,则由于 Nginx 中的错误,$_SERVER 中不存在 HTTP_HOST 变量。
请参考php-src@GitHub和nginx-quic@Github上的讨论。