如何在Apache中阻止特定的用户代理

时间:2018-08-22 18:01:28

标签: apache apache2.4

我正在配置我的Django应用程序以向我发送错误消息(例外)。

通常没有问题-但是我的电子邮件托管在Office 365上,看来Microsoft正在自动扫描和加载电子邮件中的URL。

结果是它在我的Django应用中命中了URL,并导致另一个错误...和另一封电子邮件。最终结果:一个迷人的小邮件循环,在几秒钟内向我发送了50多个消息。

我在apache日志中找到了这样的条目:

157.55.39.163 - - [22/Aug/2018:17:30:05 +0000] "GET /testerror HTTP/1.1" 500 5808 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534+ (KHTML, like Gecko) BingPreview/1.0b"

我想阻止对用户代理(包含“ BingPreview”)的访问,因此可以防止该循环。

我将其放入虚拟主机:

SetEnvIf User-Agent "^.*BingPreview.*$" bad_user

<Directory /path/top/my/app/>
   <Files wsgi.py>
       Require not env bad_user
   </Files>
</Directory>

但是当我重新加载apache时,出现错误negative Require directive has no effect in <RequireAny> directive

2 个答案:

答案 0 :(得分:2)

知道了。感谢您的提示,@ Tobias K。

我启用了mod_rewrite,因为它尚未启用。

close = () => {
  this.opened = false;
}

然后将其放入虚拟主机:

a2enmod rewrite

并重新启动了Apache以使其生效:

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT}  ^.*BingPreview.*$
RewriteRule . - [R=403,L]

我可以在apache日志中看到BingPreview被阻止(注意403):

service apache2 restart

答案 1 :(得分:0)

  

但是当我重新加载apache时,出现错误negative Require directive has no effect in <RequireAny> directive

如果没有明确说明,

<RequireAny>是默认的“隐式”容器。

您可以通过执行以下操作来解决此问题:

SetEnvIf User-Agent "BingPreview" bad_user

<Directory /path/top/my/app/>
   <Files wsgi.py>
       <RequireAll>
       Require all granted
       Require not env bad_user
       </RequireAll>
   </Files>
</Directory>

“ regex” BingReview^.*BingPreview.*$相同。