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

Posted

技术标签:

【中文标题】如何阻止特定的网站浏览器代理?【英文标题】:How to block a specific website browser agent? 【发布时间】:2018-10-21 15:18:35 【问题描述】:

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

他们通常使用 amazonaws 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]

更新: 这是我更新的 .htaac​​ess 仅供将来参考,如果它有助于社区了解它的外观。谢谢白先生

<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>

【问题讨论】:

我怀疑如果你只是在 " ... " 标记中添加用户代理字符串,它可能会起作用 - 你可能希望 Rewrite 也是 403(禁止)。 嗨@Jeof 我只是想知道,你怎么知道这是一个数据挖掘机器人?您是否仅依赖您的带宽使用数据?或者你有没有尝试过别的东西?因为我可能有同样的问题。 @MAZux 我有一个网络聊天小部件。一天中的每个特定小时,我都会有至少 5-6 名来自同一主机/国家/地区的访客每分钟浏览我在电子商务中拥有的所有产品。每天都会发生。毫无疑问,它是一个数据挖掘机器人 关于您更新的.htaccess 文件... &lt;LocationMatch&gt; 指令不允许在.htaccess 上下文中使用?您会认为这会在 Apache 上触发 500 Internal Server Error 吗? 【参考方案1】:
RewriteCond %HTTP_USER_AGENT Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu HeadlessChrome HeadlessChrome Safari/537.36

空格是 Apache 配置文件中的分隔符。因此,您可能会收到关于 invalid flags 的错误(如果您检查错误日志 - 浏览器可能只会报告 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 Forbidden 而不是 503 Service Unavailable(这实际上是一个临时状态)。

或者,要执行字典字符串比较(完全匹配),而不是正则表达式,您可以在 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+ 的语法。

【讨论】:

谢谢!我会试一试,如果他们再次回来,我会告诉你 您可以通过修改您的用户代理字符串在浏览器(或其他工具,如 CURL)中进行测试。您可以在 Chrome 的对象检查器中执行此操作(开箱即用),或者如果您经常需要执行此操作,也可以安装一个扩展程序以使其更“易于访问”。 第二种方法效果很好!非常感谢。但是我不确定为什么第一种方法不起作用。只有第二个有效 啊,是的,抱歉,第一个示例中的括号也需要反斜杠转义,以匹配用户代理字符串中的 literal 括号(否则它们会创建一个而是在正则表达式中捕获“组”)。我已经更新了我的答案。在这种情况下,第二个示例可能更可取 - 更易于实现且更易于阅读。 嗨,mrwhite,感谢您的建议。我已经关注他们并将其放在我的 .htaccess 文件的最顶部。现在它似乎适用于整个网站。我今天学到了一些新东西。我还用我的 .htaccess 更新了我的问题,让您看看希望它的顺序正确,并供公众在未来参考

以上是关于如何阻止特定的网站浏览器代理?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止360浏览器访问指定网站?

暂时阻止特定网站的编程方式?

测试是不是可以从 Web 浏览器访问 URL,即确保没有被代理服务器阻止

如何防止用户代理被用户更改

如何在charles代理中阻止localhost流量?

如何防止用户使用浏览器选项禁用脚本