我可以阻止 Apache Web 服务器上每个站点的搜索爬虫吗?
Posted
技术标签:
【中文标题】我可以阻止 Apache Web 服务器上每个站点的搜索爬虫吗?【英文标题】:Can I block search crawlers for every site on an Apache web server? 【发布时间】:2010-09-18 15:10:23 【问题描述】:我在公共互联网上有一个临时服务器,运行一些网站的生产代码副本。如果登台站点被编入索引,我真的不喜欢它。
有没有办法可以修改临时服务器上的 httpd.conf 以阻止搜索引擎爬虫?
更改 robots.txt 不会真正起作用,因为我使用脚本将相同的代码库复制到两台服务器。另外,我也不想更改虚拟主机 conf 文件,因为有一堆站点,如果我创建一个新站点,我不想记住复制某个设置。
【问题讨论】:
【参考方案1】:试试Using Apache to stop bad robots。您可以在线获取user agents 或只允许浏览器,而不是试图阻止所有机器人。
【讨论】:
【参考方案2】:您能否将暂存虚拟主机上的 robots.txt 别名为托管在不同位置的限制性 robots.txt?
【讨论】:
【参考方案3】:根据您的部署方案,您应该寻找将不同的 robots.txt 文件部署到 dev/stage/test/prod(或您拥有的任何组合)的方法。假设您在不同的服务器上有不同的数据库配置文件或(或类似的),这应该遵循类似的过程(您确实有不同的数据库密码,对吧?)
如果您没有一步到位的部署流程,这可能是一个很好的动机...有大量的工具适用于不同的环境 - Capistrano 是一个非常好的工具,并且在Rails/Django 世界,但绝不是唯一的。
如果失败了,您可能会在 Apache 配置中设置一个全局别名指令,该指令将应用于所有虚拟主机并指向限制性 robots.txt
【讨论】:
【参考方案4】:要真正阻止页面被编入索引,您需要将网站隐藏在HTTP auth 后面。您可以在全局 Apache 配置中执行此操作并使用简单的 .htpasswd 文件。
唯一的缺点是您现在必须在第一次浏览登台服务器上的任何页面时输入用户名/密码。
【讨论】:
这种方法存在问题,当您想将一些 API 暴露给不支持 HTTP Auth 的不同服务时。在这种情况下,您必须为该特定主机禁用它,这可能会导致时间混乱。【参考方案5】:您可以使用 Apache 的 mod_rewrite 来完成。假设您的真实主机是 www.example.com,而您的暂存主机是 staging.example.com。创建一个名为“robots-staging.txt”的文件并有条件地重写请求以转到该文件。
此示例适用于保护单个临时站点,比您要求的用例更简单,但这对我来说很可靠:
<IfModule mod_rewrite.c>
RewriteEngine on
# Dissuade web spiders from crawling the staging site
RewriteCond %HTTP_HOST ^staging\.example\.com$
RewriteRule ^robots.txt$ robots-staging.txt [L]
</IfModule>
您可以尝试将蜘蛛重定向到不同服务器上的主 robots.txt,但是 有些蜘蛛在从 HTTP 请求中得到除“200 OK”或“404 not found”返回码之外的任何内容后可能会犹豫不决,并且它们可能不会读取重定向的 URL。
你可以这样做:
<IfModule mod_rewrite.c>
RewriteEngine on
# Redirect web spiders to a robots.txt file elsewhere (possibly unreliable)
RewriteRule ^robots.txt$ http://www.example.com/robots-staging.txt [R]
</IfModule>
【讨论】:
【参考方案6】:创建一个包含以下内容的 robots.txt 文件:
User-agent: *
Disallow: /
将该文件放在临时服务器上的某个位置;您的目录根目录是放置它的好地方(例如/var/www/html/robots.txt
)。
将以下内容添加到您的 httpd.conf 文件中:
# Exclude all robots
<Location "/robots.txt">
SetHandler None
</Location>
Alias /robots.txt /path/to/robots.txt
SetHandler
指令可能不是必需的,但如果您使用诸如 mod_python 之类的处理程序,则可能需要它。
该 robots.txt 文件现在将为您服务器上的所有虚拟主机提供服务,覆盖您可能为单个主机提供的任何 robots.txt 文件。
(注意:我的回答与 ceejayoz 的回答建议你做的基本相同,但我不得不多花几分钟时间弄清楚所有细节才能让它发挥作用。我决定把这个答案放在这里为了其他可能偶然发现这个问题的人。)
【讨论】:
为我节省了很多时间。谢谢。Alias
指的是什么?如果我有多个虚拟主机,我应该为每个虚拟主机创建一个 Alias
吗?
@nicoX:您不需要为每个虚拟主机创建单独的Alias
。您在此处创建的将应用于您创建的所有虚拟主机。
来自httpd.conf
文件:我们有LoadModule vhost_alias_module modules/mod_vhost_alias.so
和DocumentRoot /var/www/html
,这是错误的,因为我们使用的是/var/www/vhosts
,尽管它仍然有效。我们使用Include
包含我们的虚拟主机及其httpd-include.conf
文件的路径。我在其根目录中包含了每个 vhosts 的 robots.txt
文件。而httpd.conf
我只有一个vhosts文件的别名以上是关于我可以阻止 Apache Web 服务器上每个站点的搜索爬虫吗?的主要内容,如果未能解决你的问题,请参考以下文章
VirtualHost 阻止 XAMPP 声明启动 Apache