如何阻止特定的网站浏览器代理?



最近,我在数据挖掘机器人方面遇到了一些问题,每天在一天中的某些时间从我的网站中提取数据。这不仅会浪费我的带宽,还会给我的谷歌分析提供错误的数据。

他们通常使用亚马逊IP进入,但最近他们切换到其他主机。

保持静态的是它们使用相同的用户代理。 有没有办法阻止使用用户代理?这是因为我已经尝试过,但它失败了。希望我能从中得到启示。

RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36
RewriteRule .* - [R=503,L]

更新:这是我更新的.htaacess,仅供将来参考,如果它有助于社区的外观。谢谢怀特先生

<LocationMatch .*>
<IfModule mod_security2.c>
SecRuleRemoveById 211170
SecRuleRemoveById 211180    
</IfModule>
</LocationMatch>

Options +FollowSymlinks
Options -Indexes
<FilesMatch "(?i)((.tpl|.ini|.log|(?<!robots).txt))">
Require all denied
</FilesMatch>
# SEO URL Settings
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} "=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36"
RewriteRule .* - [F]
RewriteBase /
RewriteRule ^sitemap.xml$ index.php?route=extension/feed/google_sitemap [L]
RewriteRule ^googlebase.xml$ index.php?route=extension/feed/google_base [L]
RewriteRule ^system/download/(.*) index.php?route=error/not_found [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !.*.(ico|gif|jpg|jpeg|png|js|css)
RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA]
<Files 403.shtml>
order allow,deny
allow from all
</Files>
RewriteCond %{HTTP_USER_AGENT} Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36

空格是 Apache 配置文件中的分隔符。因此,您可能会收到有关无效标志的错误(如果您检查错误日志 - 浏览器可能只会报告500错误(。您要么需要反斜杠转义用户代理字符串中的空格,要么将整个用户代理(即。CondPattern- 双引号中的RewriteCond指令(的第二个参数。另请注意,默认情况下这是一个正则表达式,因此任何特殊/元正则表达式字符也需要转义(包括.()(。

例如,请尝试以下操作:

RewriteCond %{HTTP_USER_AGENT} "^Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36$"
RewriteRule .* - [F]

这将返回 403 禁止访问,而不是 503 服务不可用(这实际上是一种临时状态(。

或者,要执行字典顺序字符串比较(完全匹配(,而不是正则表达式,您可以在CondPattern上使用=前缀运算符。例如:

RewriteCond %{HTTP_USER_AGENT} "=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36"

CondPattern现在被视为普通字符串(不是正则表达式(,因此无需转义特殊字符。

不用说,这应该与任何其他阻塞指令一起放在.htaccess文件的顶部。


更新:

如果mod_rewrite指令被覆盖(可能来自子目录中的.htaccess文件(,那么您可以使用mod_setenvif和mod_authz_core的组合(Apache 2.4+(,如下所示:

BrowserMatch "^Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36$" block_it
<RequireAll>
Require all granted
Require not env block_it
</RequireAll>

如上所述,这是 Apache 2.4+ 语法。

一种更简单、更通用的方法是使用以下方法,它删除了所有"无头"请求。(我不知道在"无头"字符串下发出的任何真实的、人为的、不可疑的请求,所以 AFAIK,完全阻止它们是安全的(

RewriteCond %{HTTP_USER_AGENT} (HeadlessChrome) [NC]
RewriteRule .* - [F]