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

gfttwv5a  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(141)

最近我遇到了一些数据挖掘机器人的问题,每天在特定的时间从我的网站提取数据,这不仅浪费了我的带宽,而且给我的谷歌分析错误的数据。
他们通常使用亚马逊的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,如果它对社区有帮助的话,只供将来参考。谢谢MrWhite

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

rnmwe5a21#

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指令的第二个参数)。另请注意,默认情况下这是一个正则表达式,因此任何特殊/ meta正则表达式字符也需要转义(包括.())。
例如,请尝试以下方法:

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 上使用=前置词运算子,而不是使用regex。例如:

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+的语法。

q8l4jmvw

q8l4jmvw2#

一个更简单、更通用的方法是使用以下方法,它可以去掉所有“Headless”请求。(我不知道在“Headless”字符串下有任何真正的、人类的、不可疑的请求,所以AFAIK,完全阻止它们是安全的)

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

相关问题