robots.txt进阶使用方法

极诣在两年前,暨robots.txt二十周年时曾经介绍过这个历史悠久同时又持续发挥着巨大影响力的txt文件。本篇我们将继续介绍两个robots.txt的进阶应用。
robots.txt使用要点
在介绍进阶应用之前,我们先来温习一下robots.txt的使用要点:
- 每个域名(不管是不是子域名)都只能最多有一个robots.txt文件,放置于网站根目录。yourname.com的robots.txt对abc.yourname.com没有约束。
- 每种协议都可以有一个robots.txt。如http://yourname.com和https://yourname.com可以分别有一个robots.txt。
- 每个端口可以有一个robots.txt。如http://yourname.com和http://yourname.com:8080可以分别有一个robots.txt。
- 文件名必须为小写。不能是RoBotS.TXT。
- user-agent的名称以及user-agent,allow,disallow,crawl-delay,sitemap这些指示符的大小写不敏感。
- robots.txt所包含的URL为大小写敏感。分清大小写才能有效排除索引。
- allow和disallow的URL必须是不包括协议、域名、端口的路径。disallow: http://yourname.com/abc.htm就错了。改为disallow: /abc.htm
- sitemap必须包括从http或https开始的完整的URL。
- robots.txt不是死链提交工具,想要删除死链索引还是应该登陆各搜索引擎站长平台提交。
- robots.txt只做减法,有没有这个文件的区别即是去不去做这个排除。删除robots.txt意味着完全开放爬虫漫游。
- robots.txt只防君子不防小人。历史上发生过多次违反robots.txt的事件。网站要把机密信息放到登陆后。
- 要想严格不让搜索引擎索引还是推荐用noindex标签。但是百度并不支持。
- crawl-delay并不被谷歌和百度支持,Yandex和Bing则支持。Yandex还支持host指示符来表示偏好的域名。
- 符号#用于注释。后面的内容会被忽略。
看不见的通配符*
这里要说的是通配符*。它代表任意长度的任意字符。请注意每一行allow,disallow之后都有一个看不见的*。
也就是说如果你写了disallow: /cat/,那么下面的内容就会影响到所有以/cat/开头的URL,比如:
- http://yourname.com/cat/abc.htm
- http://yourname.com/cat/abc.html
- http://yourname.com/cat/abc/
但是也有例外的情况,那就是allow和disallow之后没有任何赋值的情况。比如这个官方例子
User-agent: *
Disallow: /cyberworld/map/ # This is an infinite virtual URL space
# Cybermapper 可以访问任意页面
User-agent: cybermapper
Disallow:
合并多个User-Agent
如果你有多个讨厌的机器人在抓取你的网页消耗你的资源,那你可能会通过disallow屏蔽他们(当然要他们是君子的前提下)。你可以通过user-agent一次性把他们屏蔽。
User-agent: bad-bot-a
User-agent: bad-bot-b
Disallow: /
这种写法在当你有多个user-agent,每个虽然都比较复杂但是都一样的情况下显得很有用。
User-agent: bad-bot-a
User-agent: bad-bot-b
Disallow: /XXX
#以下省略200行,这样你就可以让robots.txt变得简洁。
为每个User-Agent订制Sitemap
极诣曾经在《International SEO不完全攻略》一文中指出使用目录进行多语言网站布局在SEO上的问题。由于百度这样的中文搜索引擎并不感兴趣那些泰语、挪威语甚至英语、法语,让百度蜘蛛爬行那些非中文的页面会造成很多资源的浪费,这不单影响索引而且影响排名。为此我们可以使用disallow把其他次要的页面屏蔽掉。
但是对Sitemap这个指示符来说,它并不针对某一个user-agent。不管你的Sitemap语句出现在哪里它对所有的搜索引擎都是有效的。
如果我们想让某些搜索引擎只访问特定的sitemap,这种情况下该如何处理呢?除了在站长平台提交网站地图,我们还可以在robots.txt内实现。别忘了sitemap文件也是一个资源,我们一样可以用disallow去屏蔽掉。假定我们有一个全语言的sitemap-all-lang.xml还有一个中文内容的sitemap-zh.xml。我们可以这样实现:
User-agent: *
Disallow: /sitemap-zh.xml
User-agent: baiduspider
Disallow: /sitemap-all-lang.xml
Sitemap: http://yourdomain.com/sitemap-zh.xml
Sitemap: http://yourdomain.com/sitemap-all-lang.xml
这样一来中文站点地图仅对百度可见,而全语言地图仅对百度之外的蜘蛛可见了。
Sitemap太大了该怎么办?
我们知道,一般来说搜索引擎对站点地图的大小和所包含的URL的数量都有所限制。比如百度对单个sitemap文件的限制是五万条URL和10MB的文件大小。在这种情况下,你可以在robots.txt中给出多个sitemap文件的URL。除了这种分拆方式,你还可以使用sitemap索引文件,比如下面这个百度站长给出的例子。(注意:2020年起,百度已不再支持sitemap索引文件,请在百度资源平台逐个提交。)

其他主流的搜索引擎也认这个索引格式。
那么问题来了,即便是这样,文件多且大,传输会变得非常没有效率。为了解决这个问题我们可以对站点地图进行GZIP压缩。像7-zip这样的压缩工具都可以对文件压缩。需要注意的是在压缩前你的单个站点地图文件仍然必须小于10MB并且包含URL数量小于五万条。
写在最后
以上就是我们介绍的robots.txt的高阶应用,你能够改进它的写法来提高效率了吗?如果你有其他小技巧请通过极诣的公众号告诉笔者。谢谢!