最近,我的网站日志中出现了一些引荐来源垃圾邮件。为了阻止这种情况(因为它非常烦人,还会污染我的统计数据),我想阻止来自某些引荐来源域的请求。可以找到很多文章,建议在网站的 .htaccess 文件中放入以下内容(或类似内容):
RewriteEngine On
RewriteCond %{HTTP_REFERER} example\.com [NC]
RewriteRule .* - [F]
这很好用,但是我想将其移至 Apache 配置,以便将此重写规则应用于服务器上托管的所有网站。我还了解到这对性能更好,因为 .htaccess 文件必须针对每个请求进行解析,而 Apache 配置只需加载一次。
我的服务器运行在 Ubuntu 上,因此我创建了一个新的 .conf 文件:/etc/apache2/conf-available/block-referrer-spam.conf,其内容与上面的 .htaccess 代码段完全相同。我在 conf-enabled 目录中创建了一个符号链接(使用sudo a2enmod block-referer-spam
)并重新加载了 Apache 配置(sudo service apache2 reload
)。但是,与使用 .htaccess 不同,Apache 不会阻止请求(返回 403)。
我想我可能忽略了一些简单的事情,因此任何帮助都会受到赞赏。
答案1
虚拟主机不会继承重写配置。为了“继承”vHost配置中的指令,每个vHost配置都需要:
RewriteEngine on
RewriteOptions Inherit
请参阅 Apache 关于 mod_rewrite 模块的讨论:
http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
无论如何,如果您有权访问每个 vHost 的 site.conf 文件,则您应该将这些文件用于“site”指令,并且永远不需要启用 .htaccess 文件。
另外,我假设你已经在 apache2.conf 文件中“包含”了 conf-enabled/*.conf
答案2
一个技巧是将一个.htaccess
文件放在存储 vHosts 的目录之上。
例如,如果您的 vHost 网站位于中,则将 -file/var/www/vhosts/.../
放在.htaccess
中/var/www/vhosts/.htaccess
。由于 Apache.htaccess
按目录级别的顺序读取 -file,因此它将在单个.htaccess
-file 之前被读取。