【问题标题】:.htaccess not blocking specified user agent.htaccess 不阻止指定的用户代理
【发布时间】:2015-05-05 21:08:16
【问题描述】:

更新 我找到了 Firefox 插件:用户代理切换器,它允许我使用不同的用户代理进行测试。令人惊讶的是,它按应有的方式阻止了用户代理。我想知道为什么在我第一次通过.htaccess 尝试阻止之后发生的大约 12 个请求不知何故溜进来了。页面请求是否已经在处理中?哦,好吧,至少他们在工作。


在我的.htaccess 中,我有一个 php 脚本,它检查有问题的用户代理字符串并动态写入 .htaccessRewriteCond 以立即阻止用户代理。

我试图通过编写以下条件 RewriteCond %{HTTP_USER_AGENT} ^.*(Mozilla/5\.0\ \(Auto\ Shell\ Spider\)).*$ [NC] 来阻止代理 Mozilla/5.0 (Auto Shell Spider),但我的日志显示用户代理继续访问页面(在接下来的 2 秒内又访问了 10+)。我用preg_match() 测试了规则,它匹配,因此应该阻止用户代理。怎么了? 我的印象是我不需要ANDRewriteCond 中,因为每个都有自己的RewriteRule。我不相信.htaccess 的缓存 - 更改应该立即生效。 php正则表达式与htaccess不同吗?

任何帮助将不胜感激。

这里有一套更完整的.htaccess说明:

RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php

# Block spiders: 
    RewriteCond %{HTTP_USER_AGENT} ^.*(Baiduspider|360Spider|Sogou|Sosospider|Yandex|NaverBot|Yeti|moget|ichiro|RedBot|AhrefsBot|xovibot).*$ [NC]
    RewriteRule .* - [R=403,L]
Deny from 59.61.184.100
Deny from 59.152.240.71

# Block User Agent -  NOT WORKING?
RewriteCond %{HTTP_USER_AGENT} ^.*(Mozilla/5\.0\ \(Auto\ Shell\ Spider\)).*$ [NC]
RewriteRule .* - [R=403,L]

使用 php preg_match 时,

$text =  "Mozilla/5.0 (Auto Shell Spider)";
preg_match('`^.*(Mozilla/5\.0\ \(Auto\ Shell\ Spider\)).*$`', $text, $acell);    
echo "<pre>";var_dump($acell);echo "</pre>";    

我得到一个匹配如下:

array (size=2)
  0 => string 'Mozilla/5.0 (Auto Shell Spider)' (length=31)
  1 => string 'Mozilla/5.0 (Auto Shell Spider)' (length=31)

【问题讨论】:

    标签: regex .htaccess mod-rewrite user-agent


    【解决方案1】:

    尝试像这样重新排序规则:

    Deny from 59.61.184.100
    Deny from 59.152.240.71
    
    RewriteEngine On
    
    # Block spiders: 
    RewriteCond %{HTTP_USER_AGENT} ^.*(Baiduspider|360Spider|Sogou|Sosospider|Yandex|NaverBot|Yeti|moget|ichiro|RedBot|AhrefsBot|xovibot).*$ [NC]
    RewriteRule ^ - [R=403,L]
    
    # Block User Agent -  NOT WORKING?
    RewriteCond %{HTTP_USER_AGENT} "Mozilla/5\.0 \(Auto Shell Spider\)" [NC]
    RewriteRule ^ - [R=403,L]
    
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^ index.php [L]
    

    【讨论】:

    • 你能解释一下为什么这会产生预期的结果吗?我的脚本每次发现新的罪犯时都会简单地附加新的 RewriteRule。将新规则插入到.htaccess的中间比较复杂,而且很难调试看更改是否有效。在进行额外的工作之前,了解为什么原件不起作用会很有帮助。我知道 .htaccess 按顺序处理命令,但我不明白当前顺序会如何冲突。谢谢。
    • 我找到了 Firefox 插件:用户代理切换器,它允许我使用不同的用户代理进行测试。令人惊讶的是,它按应有的方式阻止了用户代理。我想知道为什么在我的第一次块尝试之后发生的大约 12 个请求以某种方式滑入。缓存?时间(请求已经在处理中)?无论如何,无论如何,我都会将您的回答作为很好的建议。谢谢。
    • htaccess 不会被缓存,除非您在前面使用了一些代理或其他一些 CMS 框架。 .htaccess 中所做的任何更改都会立即生效,否则浏览器有时也可以缓存结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 2016-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多