限制通过 Apache 上的 HTTP 0.9 和 HTTP 1.0 进行访问

限制通过 Apache 上的 HTTP 0.9 和 HTTP 1.0 进行访问

是否可以阻止 Apache 上所有虚拟主机的除 HTTP 1.1 和 HTTP/2 之外的任何访问?

我将下面的代码添加到 apache2.conf,但我仍然看到 IP 请求通过 HTTP 1.0 发出

#Block HTTP 0.9
RewriteEngine On
RewriteCond %{THE_REQUEST} HTTP/0\.9$
RewriteRule .* - [F]

#Block HTTP 1.0
RewriteEngine On
RewriteCond %{THE_REQUEST} HTTP/1\.0$
RewriteRule .* - [F]

答案1

这是一种简单的方法:

RewriteCond %{THE_REQUEST} !HTTP/
RewriteRule .* - [R=451,L]
RewriteCond %{THE_REQUEST} HTTP/1\.0
RewriteRule .* - [R=451,L]

HTTP 0.9 请求的格式GET /不包含任何 HTTP/XX 版本指示符,因此第一条规则将捕获它们。我已将规则设为区分大小写,因此它还会捕获未正确将“HTTP”大写的客户端,这对于合法客户端来说应该不是问题;您可以根据需要将其设为不区分大小写,但您可能还希望将第二条规则设为不区分大小写,这样 HTTP1.0 流量就无法以“http/1.0”或类似名称偷偷溜走。

您必须决定要发回哪种响应代码。在此示例中,我曾经R=451发回一个451 Unavailable For Legal Reasons,这样我就可以在日志中轻松发现这些,因为 Apache 永远不会自行生成该错误。(我尝试使用,418 I'm a teapot但 Apache 目前不允许这样做)。

为了简单起见,R=您可以简单地使用Gfor410 GoneFfor ,而不必使用403 Forbidden

RewriteCond %{THE_REQUEST} !HTTP/
RewriteRule .* - [G,L]
RewriteCond %{THE_REQUEST} HTTP/1\.0
RewriteRule .* - [F,L]

注意事项:

  1. 您仍然会在日志中看到请求,但您应该看到适当的响应代码。

  2. 如果您使用自定义错误页面,则可能需要额外的RewriteCond语句,以便在尝试加载错误页面时不会再次触发重定向。

  3. 其他重定向可能会在这些重定向之前被调用。例如,如果您将这些重定向放在全局配置中,但在 vhost 配置中也有 HTTP 到 HTTPS 重定向,则后者可能会先执行。

相关内容