我运营一个网站,为许多开源项目提供 Subversion 和 TRAC。这非常有效,但有一个例外:许多搜索引擎并不关心,robots.txt
并且对 TRAC 中的许多并行请求(例如 TRAC 变更集为 tar/zip)的 Web 服务器进行 DoS 攻击。
由于我在一个域下运行大量 TRAC 存储库,因此我使用了通配符robots.txt
,根据 Google 的说法,这应该是允许的:
User-agent: *
Disallow: /*/changeset
Disallow: /*/browser
Disallow: /*/log
不幸的是,即使 Google 也不关心这一点,尽管网站管理员工具确认应忽略特定 URI。是的,我告诉过他们,但他们并不关心。当然,Yandex 等其他公司也不关心这一点。
因此 B 计划是在 Apache 配置中将它们锁定,我的一个朋友给了我一些关于如何做到这一点的提示:
<Directory /foo/bar>
SetEnvIf User-Agent Yandex BlockYandex=1
SetEnvIf User-Agent METASpider BlockMETASpider=1
SetEnvIf User-Agent Mail.ru BlockMailru=1
Order allow,deny
Allow from all
Deny from env=BlockYandex
Deny from env=BlockMETASpider
Deny from env=BlockMailru
</Directory>
现在我试着弄清楚我是否也可以使用通配符做类似的事情,这样我就不必<Directory>
为每个存储库创建一个部分。我<LocationMatch>
发现Apache 文档但我不确定是否可以用它来替代<Directory>
。
所以我的问题是,我可以使用<LocationMatch>
这个吗?或者是否有人对在服务器端过滤机器人有更好的想法?
答案1
(我想按照网站的建议在线回答它,但编辑问题会导致错误消息)
我查阅了 Apache.org 上的更多文档,并自己弄清楚了:
# get rid of the bots which are too stupid to respect robots.txt
<LocationMatch "/[^/]+/(browser|changeset|log)">
BrowserMatchNoCase googlebot ImBot
BrowserMatchNoCase Yandex ImBot
BrowserMatchNoCase bingbot ImBot
Order allow,deny
Allow from all
Deny from env=ImBot
</LocationMatch>
参考:
- 位置匹配: http://httpd.apache.org/docs/2.2/mod/core.html#locationmatch
- BrowserMatchNoCase: http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html#browsermatchnocase
使用浏览器的用户代理切换器扩展进行测试。由于新手限制,我无法发布更多链接 :) 我的站点是 svn.netlabs.org,供想要尝试的人使用。