apache2 被引荐来源网址阻止而不是阻止域

问题描述 投票:0回答:1

我一直在尝试一切方法来阻止 apache2 中的引荐来源网址,但它不起作用,并且条目仍然出现在日志中,就好像它没有生效一样。

这就是条目在日志 (access.log) 中的显示方式:

xxx.216.45.xxx - - [09/Feb/2024:13:59:18 +0000] "GET /public/file.txt HTTP/1.1" 200 361 "https://example.com/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36"

我已确保 mod_write 已打开:

a2enmod rewrite
Module rewrite already enabled
root@:~#

这是我放在

.htaccess
直接在
/var/www/html

下的内容
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https://(.*\.)?example\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^https://(.*\.)?example\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^example\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^example\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^https://example\.com/ [NC]
RewriteRule ^(.*)$ – [F,L]
</IfModule>

但它仍然在日志中显示为“200”,这意味着它正在被服务并正在攻击我的服务器。它来自多个 IP 地址,所以我无法以这种方式阻止它。

本质上我想做的是阻止来自 https://example.com 的任何内容访问服务器上的任何内容。

我检查过的其他事情是以下几行出现在 default-ssl.conf 文件中:

RewriteEngine On
RewriteOptions inherit

这是来自

apache2.conf

的 LogFormat 行

LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined

我不知道还能尝试什么,欢迎任何建议。

mod-rewrite apache2 http-referer
1个回答
0
投票

我输入了垃圾文字,没有错误。

如果您在

.htaccess
文件顶部输入“nonsense”时没有收到错误(您应该收到 500 内部服务器错误),那么看起来
.htaccess
文件甚至没有被处理。

您需要确保在服务器配置/VirtualHost 容器中启用

.htaccess
覆盖,并在相应的
AllowOverride All
容器中设置
AllowOverride FileInfo
(或至少
<Directory /var/www/html>
以允许使用 mod_rewrite)。并且没有压倒性的
AllowOverride None
指令。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https://(.*\.)?example\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^https://(.*\.)?example\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^example\.com [NC,OR]
RewriteCond %{HTTP_REFERER} ^example\.com/ [NC,OR]
RewriteCond %{HTTP_REFERER} ^https://example\.com/ [NC]
RewriteRule ^(.*)$ – [F,L]
</IfModule>

否则,这条规则没问题,但可以大大简化。

<IfModule>
不是必需的(除非这完全是可选的),并且 5 个条件
RewriteCond
指令)可以减少为单个条件。

条件 3 和 4 永远不会成功,因为

Referer
标头将始终包含协议。条件 5 已由条件 2 处理。

正则表达式

^(.*)$
可以简化/优化,因为您不需要匹配所有内容(并且您当然不需要捕获任何内容),它只需要成功即可。使用
L
时不需要
F
标志,因为它是隐含的。

所以上面可以这样写:

RewriteEngine On
RewriteCond %{HTTP_REFERER} ^https?://(.+\.)?example\.com($|/) [NC]
RewriteRule ^ – [F]

这比原始规则更具包容性,因为它还阻止普通 HTTP 引用站点以及 HTTPS。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.