我有一个“内容”网站,一些吸血鬼和 419 骗子喜欢积极抓取,这也会产生成本和性能问题。 :( 我别无选择:我需要阻止他们访问站点地图文件和索引。 :(
我做的和 Facebook 一样:我动态生成站点地图索引 (/sitemap.php)。我使用 DNS 反向查找 (PHP) 和代理检查将“良好”爬虫列入白名单(与 Stackoverflow 相同)。为了防止列入白名单的引擎公开站点地图索引内容,我添加了该标头(Stackoverflow 忘记了它):
header('Content-type: application/xml; charset="UTF-8"', true);
header('Pragma: no-cache');
header('X-Robots-Tag: NOARCHIVE');
问题 1:我是否缺少某些东西来保护站点地图索引文件?
问题2:问题出在生成的静态站点地图 (.xml.gz) 文件上。我该如何保护它们?即使它们的名称“难以猜测”,也可以通过简单的 Google 查询轻松找到它们(例如:“站点:stackoverflow.com 文件类型:xml“),并且我对 .htaccess 的访问权限非常有限。
编辑:这不是服务器配置问题。首选语言是 PHP。
编辑2:抱歉,这是纯粹的程序性问题,但它已从 SO 转移而来,我无法关闭/删除它。:(
答案1
您可以始终使用一个 URL 作为站点地图,该 URL 不会向除您明确提交到的引擎之外的任何人透露。
答案2
您应该使用白名单,并且只允许好的搜索引擎(如 Google 和 Bing)访问这些站点地图文件。
这是一个巨大的问题,恐怕大多数人在向 Google 和 Bing 提交站点地图文件时都不会考虑到这一点。我跟踪了对我的 xml 站点地图文件的每个请求,自从我开始这样做(3 个月前)以来,我已经拒绝了超过 6,500 个 IP 的访问。现在只有 Google、Bing 和其他一些网站可以查看这些文件。
由于您使用的是白名单而不是黑名单,他们可以购买他们想要的所有代理,并且永远无法通过。此外,在将 IP 列入白名单之前,您还应该执行反向 DNS 查找,以确保它们确实来自 Google 或 Bing。至于如何在 PHP 中执行此操作,我不知道,因为我们是一家 Microsoft 商店,只进行 ASP.NET 开发。我将首先获取 Google 和 Bing 运行其机器人的 IP 范围,然后当请求来自其中一个 IP 时,执行 DNS 查找并确保 DNS 名称中存在“googlebot”或“msnbot”,如果是,则对该名称执行反向 DNS 查找,以确保返回的 IP 地址与原始 IP 地址匹配。如果匹配,那么您可以安全地允许 IP 查看您的站点地图文件,如果不匹配,则拒绝访问并 404 错误。顺便说一句,我与一位 Google 技术人员交谈时学到了这种技术,所以它非常可靠。
请注意,我拥有并运营一个每月页面浏览量约为 4,000,000 的网站,因此对我来说,这是重中之重,因为我不想我的数据被轻易删除。此外,在 12 小时内从同一 IP 发出 50 次页面请求后,我会使用 recaptcha,这确实可以很好地清除机器人。
我花时间写了这篇文章,因为我希望它能够帮助其他人,并阐明我认为是一个很大程度上被忽视的问题。
答案3
怎么样不是临时创建 sitemap.php?而是每天重新生成一次(或任何有意义的方式),并将其作为静态文件提供。这样,即使每天有 10,000 个爬虫请求它——那又怎么样?
答案4
您可以使用 robots.txt 来禁止该文件,但您也可以阻止 IP。一种简单的方法是查看您的网络日志中的 HTTP 引荐来源,并编写一个 cron 作业来获取这些 IP(按引荐来源)并将它们添加到您网站的 hosts.deny 中。