我试图阻止访问此访问我的用户代理:Mozilla/5.0 (compatible; Seekport Crawler; http://seekport.com/
(最后没有 )
,这不是故障)。
我试过这个(还有两个代理)
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} OnalyticaBot [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Re-re Studio (+http://vip0.ru/) [NC, OR]
RewriteCond %{HTTP_USER_AGENT} Mozilla/5.0 (compatible; Seekport Crawler; http://seekport.com/ [NC]
RewriteRule .* - [F,L]
我已经用这个语法尝试了更多(使用整个字符串并且只使用“Seekport”),但仍然看到代理用户在日志中要求RewriteCond %{HTTP_USER_AGENT} ^.(user_agent1|user_agent2).$ [NC]
你可以帮帮我吗?
最佳答案
RewriteCond %{HTTP_USER_AGENT} Re-re Studio (+http://vip0.ru/) [NC, OR]
默认情况下,
RewriteCond
的第二个参数指令是正则表达式(regex),因此任何元字符(例如 +
和 .
)都需要正确转义。但重要的是,空格是 Apache 配置文件中的分隔符,因此这些也需要转义,否则,该指令将完全无效。在 Apache 上,由于“错误的标志分隔符”,上述内容将导致 fatal error (500 Internal Server Error)。在 LiteSpeed 上,它只会默默地失败。空格可以通过以下任一方式“转义”:
\
在 hello\ world
\s
表示任何空白字符的速记字符类。例如。 hello\sworld
. "hello world"
. [NC, OR]
- 但是,标志分隔符参数中不应有空格。这应该是 [NC,OR]
(没有空间)。所以,上面的可以写成这样:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} OnalyticaBot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "Re-re Studio (\+http://vip0\.ru/)" [NC,OR]
RewriteCond %{HTTP_USER_AGENT} "^Mozilla/5\.0 (compatible; Seekport Crawler; http://seekport\.com/$" [NC]
RewriteRule ^ - [F]
正则表达式 .*
在 RewriteRule
模式可以简化为^
(效率更高)和 L
使用 F
时不需要标志——这是暗示。如果你想匹配整个用户代理字符串,那么你可以使用
=
(相等的字典字符串比较)前缀运算符(与双引号一起)在 CondPattern 上测试精确匹配。例如:
RewriteCond %{HTTP_USER_AGENT} "=This is the exact user-agent I want to block"
RewriteRule ^ - [F]
在上面的例子中,字符串 This is the ... block
是一个普通的字符串,而不是一个正则表达式。
关于.htaccess - 如何在 htaccess 中使用 mod_rewrite 阻止用户代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66137651/