我一直在尝试一切方法来阻止 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
我不知道还能尝试什么,欢迎任何建议。
我输入了垃圾文字,没有错误。
如果您在
.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。