提到SEO优化,我们往往会忽视一个很重要的东西:Robots.txt文件。很多朋友在做优化的时候,更多去关注页面性能、内部链接等,但是忽视了Robots.txt的重要性。今天我们来一起了解下Robots.txt和SEO有什么过往交集。
Robots.txt 介绍
Robots.txt 是网站中最简单的一个文件,但同时也是最容易出错的。仅仅是一个字符的错误可能会影响你的SEO效果、阻碍搜索引擎抓取你网站中的有效内容。
robots.txt文件的配置错误经常发生,即使经验丰富的SEO人员也是如此。
Robots.txt文件是什么? {#what-is-robots-txt}
Robots.txt文件是用来告诉搜索引擎,网站上的哪些页面可以抓取,哪些页面不能抓取。
首先,它列出了你想从搜索引擎(如Google)中排除的所有内容。你还可以告诉某些搜索引擎(非Google)应该如何抓取网站的内容。
重要提示
大多数搜索引擎都会遵循规则,它们没有打破规则的习惯。换句话说,少部分的搜索引擎则会无视这些规则。
Google不是那些搜索引擎之一。他们遵守robots.txt文件中的声明。
只是我们知道有些搜索引擎完全忽略它。
Robots.txt长什么样? {#what-does-robots-txt-look-like}
以下是Robots.txt文件的基本格式:
Sitemap: [URL location of sitemap]
User-agent: [bot identifier]
[directive 1]
[directive 2]
[directive ...]
User-agent: [another bot identifier]
[directive 1]
[directive 2]
[directive ...]
如果你以前从未看过这些内容,你可能会觉得很难。但实际上,它的语法非常简单。简而言之,你可以通过在文件中指定user-agents(用户代理)和directives(指令)来为搜索引擎蜘蛛分配抓取规则。
让我们详细的讨论则两个组件。
User-agents(用户代理) {#user-agents-directives}
每个搜索引擎都有一个特定的用户代理。你可以在robots.txt文件中针对不同的用户代理分配抓取规则。总共大约有上百种用户代理,以下是一些对SEO有用的用户代理:
-
Google: Googlebot
-
Google Images: Googlebot-Image
-
Bing: Bingbot
-
Yahoo: Slurp
-
Baidu: Baiduspider
-
DuckDuckGo: DuckDuckBot
小提示. robots.txt中的所有用户代理均严格区分大小写。
你也可以使用通配符(*)来一次性为所有的用户代理制定规则。
举个例子,假设你想屏蔽除了谷歌以外的搜索引擎蜘蛛,下面就是做法:
User-agent: *
Disallow: /
User-agent: Googlebot
Allow: /
你需要知道,在 robots.txt文件中,你可以指定无数个用户代理。虽然这么说,每当你指定一个新的用户代理时,它都是独立的。换句话说,如果你陆续为多一个用户代理制定了规则,那么第一个用户代理的规则并不适用于第二个,或者时第三个。
有一个例外就是,如果你针对同一个用户代理制定了多次规则,那么这些规则则会被放在一起执行。
重要提示
蜘蛛只会遵循准确表明详细用户代理的指令。所以上方的 robots.txt文件只会排除除谷歌蜘蛛(以及其它类型的谷歌蜘蛛)以外的搜索引擎爬虫。谷歌蜘蛛会忽略一些不太具体的用户代理声明。
Directives(指令) {#h.n4jg98bc59z}
指令指的是你希望用户代理遵循的规则。
目前支持的指令 {#h.e9kpuly4g0mq}
下面是谷歌目前支持的指令,以及它们的用法.
Disallow指令 {#h.xeq6vut3hh39}
使用此指令来规定搜索引擎不要访问特定路径的文件和页面。例如,如果你想阻止所有搜索引擎访问你的博客及其所有帖子,则robots.txt文件就像下方这样:
User-agent: *
Disallow: /blog
小提示. 如果你再disallow指令后面没有给出详细的路径,那么搜索引擎就会忽略它。
Allow指令 {#h.u53y90qh3toz}
使用此指令来规定搜索引擎需要访问特定路径的文件和页面------即使在一个被disallow指令屏蔽的路径中也可以使用。如果你屏蔽特定文章以外的所有文章页面,那么robots.txt应该像下方这样:
User-agent: *
Disallow: /blog
Allow: /blog/allowed-post
在这个例子中,搜索引擎可以访问: /blog/allowed-post
. 但是它不能访问:
/blog/another-post
/blog/yet-another-post
/blog/download-me.pdf
谷歌和必应都支持这个指令。
小提示. 和disallow指令一样,如果你在allow指令之后没有声明路径,那么搜索引擎会忽略它。
有关规则冲突的说明
除非你非常的细心,否则部分情况disallow指令会与allow指令互相冲突。下方的这个例子,我们阻止了访问了这个页面 /blog/
同时开放了这个页面 /blog
.
User-agent: *
Disallow: /blog/
Allow: /blog
这个例子中,这个URL /blog/post-title/
似乎即被阻止了,又被允许了。那么到底是哪一个呢?
对与谷歌和必应来说,它们会遵循指令字符较长的那一个,在这个例子中就是disallow指令。
Disallow: /blog/
(6 字符)
Allow: /blog
(5 字符)
如果disallow指令和allow指令长度一样,那么限制范围较小的指令会胜出,这种情况就是allow指令。
小提示.
这里, /blog
(没有斜杠为后缀) 是可以被抓取的。
严格来说,这只适用于谷歌和必应搜索引擎。其它搜索引擎会遵循第一条指令,这种情况就是disallow指令。
Sitemap指令 {#h.bcoscz7v58m1}
使用此指令来标记你网站地图所的位置。如果你对网站地图不熟悉,它通常会包含你需要被搜索引擎抓取&索引的所有页面链接。
下面就是一个使用Sitemap指令的robots.txt文件:
Sitemap: https://www.domain.com/sitemap.xml
User-agent: *
Disallow: /blog/
Allow: /blog/post-title/
在robots.txt中注明sitemap指令有多么重要呢?如果你已经向谷歌提交了网站地图,那么这一步操作就可有可无。但是,对于其它搜索引擎,比如必应,就可以明确的告诉它你的网站地图在哪里,所以这一步还是很有必要的。
注意,你不需要针对不同的代理重复标注sitemap指令。所以最好的方法是将sitemap指令写在robots.txt的最开始或者最末尾,就像下方这样:
Sitemap: https://www.domain.com/sitemap.xml
User-agent: Googlebot
Disallow: /blog/
Allow: /blog/post-title/
User-agent: Bingbot
Disallow: /services/
谷歌支持sitemap指令、同时Ask、必应、雅虎搜索引擎都支持。
小提示. 你可以在robots.txt中使用多条sitemap指令。
不再支持的指令 {#h.iw9jdhsx9lph}
下面是一些谷歌不再支持的指令------部分因为技术原因一直都没有被支持过。
Crawl-delay指令 {#h.nh0j3m4oqdg5}
之前你可以使用这个指令来指定抓取间隔时间(秒)。比如,你希望谷歌蜘蛛再每次抓取之后等待5秒,那么你就需要将Crawl-delay指令设置为5:
User-agent: Googlebot
Crawl-delay: 5
谷歌已经不再支持这个指令,但是必应和Yandex依然支持。
虽然这么说,在设置这个指令的时候你需要小心,尤其是你有一个大型网站的时候。如果你将Crawl-delay指令设置为5,那么每天蜘蛛最多只能抓取17,280个URL。如果你有上百万的页面,这个抓取量就非常的小了。反之,如果你是小型网站,则它可以帮你节省带宽。
Noindex指令 {#h.adsbtb5ez6n8}
这个指令从来没有被谷歌支持过。但是直到最近,人们认为谷歌有一些"处理不受支持和未发布的规则的代码(例如noindex)"。所以如果你希望阻止谷歌索引你所有的博客页面,那么你可以使用这个指令:
User-agent: Googlebot
Noindex: /blog/
但是同时,在2019年9月1号,谷歌明确表示这个指令不被支持。如果你想从搜索引擎中排除一个页面的话,使用meta robots标签、或者是x-robots HTTP头部指令。
Nofollow指令 {#h.8cnsyktzcwz2}
这个指令谷歌也是从来没有从官方支持过的。曾经是用来阻止搜索引擎跟随某一个链接,或者是某个特殊的路径。比如,你想屏蔽谷歌跟随所有的博客链接,你可以这么设置指令:
User-agent: Googlebot
Nofollow: /blog/
谷歌在2019年9月1号声明这个指令不会被支持。如果你想阻止搜索引擎跟随页面上的所有链接,那么你应该使用meta robots标签、或者是x-robots HTTP头部指令。如果你想指定一个链接不让谷歌跟随,那么你可以在特定链接中加入rel="nofollow"参数。
你需要一个Robots.txt文件吗? {#do-you-need-robots-txt}
对于一部分网站来说,有没有robots.txt其实无关痛痒,尤其是小网站。
虽然这么说,但是没有一个好的理由不去拥有它。它可以在搜索引擎访问网站的规则上给你一些额外的控制权,那么这可以帮助你:
-
防止抓取重复页面;
-
让网站在某个阶段不公开 (比如:在搭建网站雏形时);
-
防止抓取内部搜索页面;
-
防止服务器过载;
-
防止谷歌浪费crawl budget(抓取预算);
-
防止部分图片、视频及其它资源展示在谷歌结果中。
请注意,尽管谷歌通常不会索引robots.txt中阻止的网页,但这无法保证使用robots.txt文件可以100%将其排除在搜索结果之外。
谷歌说过,如果内容从另外一个地方获得链接,那么依然有可能被呈现在搜索结果当中。
如何找到你的robots.txt文件? {#how-to-find-robots-txt}
如果你的网站已经有了robots.txt文件,那么你可以通过domain.com/robots.txt 这个链接进行访问。如果你看到有类似下方这样的信息,这就是你的robots.txt文件:
如何建立一个robots.txt文件? {#how-to-create-robots-txt}
如果你没有robots.txt文件的话,那么做一个也十分的简单。你只需要打卡一个空的.txt文件(记事本文件)然后按照要求填写指令。比如,你希望搜索引擎不抓取你的 /admin/
目录,你可以像下方这样设置:
User-agent: *
Disallow: /admin/
你可以继续添加指令,只要你满意为止,然后将文件保存为"robots.txt"。
除此之外,你还可以使用robots.txt生成工具来制作,好比这个:
利用类似这样工具的优势就是你可以避免指令语法错误。这个非常重要,因为一个小的语法错误都会导致灾难性的后果,还是小心无大错比较好。
劣势就是,这些工具在某些程度上无法自由的自定义。
在哪里放置robots.txt文件呢? {#h.yq1lrfsdiwne}
将robots.txt文件放置在对应域名/子域名的根目录文件夹中。比如,如果你的网站使用的是domain.com,那么robots.txt就可以通过domain.com/robots.txt访问到。
如果你希望你控制二级域名的访问限制,比如blog.domain.com,那么它的robots.txt就需要通过blog.domain.com/robots.txt访问到才可以。
Robots.txt的最佳做法 {#robots-txt-best-practices}
牢记下方提示,可以避免不必要的错误:
每一个新指令都需要另起一行 {#h.4ja7xjwvnmfu}
每个指令都需要新起一行。否则会让搜索引擎产生误解:
错误示例:
User-agent: * Disallow: /directory/ Disallow: /another-directory/
标准示例:
User-agent: *
Disallow: /directory/
Disallow: /another-directory/
使用通配符简化指令 {#h.rekrsx8vje7a}
你不仅可以使用通配符(*)将指令应用于所有用户代理,同时可以在声明指令时用来匹配雷同的URL。例如,如果你想防止搜索引擎访问网站上的参数化产品类别URL,可以像这样列出它们:
User-agent: *
Disallow: /products/t-shirts?
Disallow: /products/hoodies?
Disallow: /products/jackets?
…
但是这并不简洁,你可以利用通配符,简写成下方这样:
User-agent: *
Disallow: /products/*?
这个例子就是屏蔽了所有的搜索引擎用户抓取 /product/ 目录下,所有包含问号(?)的链接。换句话说就是屏蔽了所有带有参数的产品链接。
使用美元符号($)来标注以特定字符结尾的URL {#h.knb97megi2aa}
在指令最后加入"$"。比如,如果你像屏蔽所有以 .pdf结尾的链接,那么你的可以这样设置你的 robots.txt:
User-agent: *
Disallow: /*.pdf$
这个例子中,搜索引擎无法抓取任何以 .pdf 结尾的链接,意味着搜索引擎无法抓取 /file.pdf,但是搜索引擎可以抓取这个 /file.pdf?id=68937586,因为它没有以".pdf"结尾。
相同的用户代理只声明一次 {#h.mlkkeqnd20fl}
如果你多次声明相同的用户代理,谷歌虽然并不反对,依然可以结合在一起执行。比如,像下方这样...
User-agent: Googlebot
Disallow: /a/
User-agent: Googlebot
Disallow: /b/
... 谷歌蜘蛛不会抓取两个中任何一个目录。
虽然这么说,最好只声明一次,因为这不会产生困惑。换句话说,保持简单明了,可以让你不会出现致命的错误。
使用精准的指令避免以外的错误 {#h.mokko59ndnz1}
如果不使用精准的指令,那么很可能会导致SEO中产生致命的错误。假设你现在有一个多语言的网站,正在操作一个德语版本的 /de/ 子目录。
因为还未完成,所以暂时你想阻止搜索引擎抓取这个目录内的内容。
下方的robots.txt文件可以屏蔽搜索引擎抓取这个目录以及下方的所有内容:
User-agent: *
Disallow: /de
但是,同时这也阻止了搜索引擎抓取所有以 /de
.开头的内容。
比如:
/designer-dresses/
/delivery-information.html
/depeche-mode/t-shirts/
/definitely-not-for-public-viewing.pdf
这种情况,解决方法也很简单,只需要在后面加个斜杠:
User-agent: *
Disallow: /de/
使用注释给开发者提供说明 {#h.oib4nu2jq9me}
使用注释功能,可以向开发者说明你的robots.txt指令的用途------很可能是未来的你自己。如果需要使用注释,只需要以(#)开头即可:
# This instructs Bing not to crawl our site.
User-agent: Bingbot
Disallow: /
蜘蛛会忽略所有以(#)开头的指令。
针对不同的子域名使用不同的robots.txt文件 {#h.ab5s6cpcb58d}
Robots.txt只在当前所属的子域名中生效。如果你需要控制不同的子域名抓取规则,那么你就需要分开设置不同的robots.txt文件。
比如,你的主站运行在 domain.com 上,你的博客运行在 blog.domain.com 上。那么你就需要有两个robots.txt文件。一个是放在主站的根目录中,一个是放在博客站的根目录中。
Robots.txt文件示例 {#example-robots-txt}
下方使一些 robots.txt的文件示例。这些主要是为了给你一些启发。但是如果碰巧符合你需求的,可以请将其复制粘贴到记事本文档中,另存为" robots.txt",然后将其上传到对应的根目录中。
允许所有蜘蛛访问 {#h.1n1m7h3dyha}
User-agent: *
Disallow: /
小提示. 在指令后没有声明URL会使该指令变得多余。换句话说,搜索引擎会忽略它。这就是为什么这里的disallow指令是无效的原因。搜索引擎仍然可以抓取所有页面和文件。
不允许任何蜘蛛访问 {#h.fgs8chz9cqba}
User-agent: *
Disallow: /
针对所有蜘蛛屏蔽一个目录 {#h.9nrikxjznhp3}
User-agent: *
Disallow: /folder/
针对所有蜘蛛,屏蔽一个目录(只保留一个页面) {#h.ady68csybqi9}
User-agent: *
Disallow: /folder/
Allow: /folder/page.html
针对所有蜘蛛,屏蔽一个文件 {#h.u5ts09d6bi3w}
User-agent: *
Disallow: /this-is-a-file.pdf
针对所有蜘蛛,屏蔽所有的pdf文件 {#h.hx12gnunsjfg}
User-agent: *
Disallow: /*.pdf$
针对谷歌蜘蛛,屏蔽所有带参数URL {#h.ytj6ejpwnyfr}
User-agent: Googlebot
Disallow: /*?
如何检测robots.txt文件中的问题? {#robots-txt-errors}
Robots.txt很容易出现错误,因此检测是十分有必要的。
为了检测robots.txt相关问题,你只需要查看 Search Console(谷歌资源管理器)【https://search.google.com/search-console/about】中的 "Coverage(覆盖率)"报告。下面就是一些常见的错误,包括它们的含义以及解决方法:
是否需要检查与某个页面相关的错误?
将特定URL放入Search Console(谷歌资源管理器)的URL Inspection tool(网址检测)。如果被robots.txt屏蔽了,那么就会像下方这样显示:
提交的URL被robots.txt屏蔽了 {#h.pfvffx6czlpu}
这意味着至少在你提交的Sitemap当中,至少有一条URL被robots.txt屏蔽了。
如果你是正确的创建了你的sitemap,并且不包含canonicalized(规范标签)、noindexed(指定不索引)、redirected(跳转)等页面,那么你提交的所有的链接都不应该被robots.txt屏蔽。如果被屏蔽了,调查受影响的页面,然后相应地调整robots.txt文件,删除阻止该页面的指令。
你可以使用谷歌的robots.txt检测工具【https://support.google.com/webmasters/answer/6062598?hl=en】来查看哪条指令在阻止访问。在修改的时候你需要小心,因为很容易就会影响到其它的页面以及文件。
被robots.txt屏蔽了 {#h.7ld4xnrz2ux8}
这代表,当前你有内容被robots.txt屏蔽了,但是暂时没有被谷歌索引。
如果这个内容很重要,并且需要被索引,删除robots.txt中的阻碍抓取的指令。(同时你得注意这个内容是否被索引标记标注为不索引状态)如果你需要屏蔽的内容也是不需要谷歌索引的话,那么你可以去掉屏蔽抓取的指令,然后使用meta robots标签、或者是x-robots HTTP头部指令进行屏蔽------这样就可以保证内容不被索引。
小提示. 如果想要将页面从索引中删除,必需先移除抓取阻碍。否则,谷歌无法抓取到页面的noindex(不索引)标记、或是HTTP头部指令------这样只会让搜索引擎保持原有的索引状态。
索引但是被robots.txt屏蔽 {#h.ityx2fryl2nz}
这意味着虽然一部分内容被robots.txt屏蔽了,但是依然是被谷歌索引的。
同样道理,如果你希望从搜索引擎中去除该内容,robots.txt并不是最好的选择。移除抓取阻碍,并使用meta robots标记、或者是x-robots HTTP头部指令防止被索引。
如果你是不小心屏蔽了这个内容,并且希望内容被谷歌索引的话,只需要在robots.txt中移除阻碍索引的指令即可。这样可以帮助你的内容更好的展现在谷歌当中。
常见问题 {#h.xxzee0aa057a}
下面是经常被问到的,但是并没有涵盖在上方内容中的一些问题。你可以在评论中留下你的问题,我们会根据情况进行更新。
robots.txt文件大小最大是多少? {#h.c90q8sw2w1mv}
500 千字节 (大概).
WordPress中的robots.txt在哪里? {#h.z8oryso7ogge}
例子: domain.com/robots.txt.
如何在Wordpress当中编辑robots.txt? {#h.3z64vt89slrv}
你可以手动编辑,或者使用这些Wordpress插件其中的一个。比如像Yoast,它可以让你直接在后台编辑robots.txt文件。
如果我通过robots.txt屏蔽了不索引的页面有什么影响? {#h.it6da41zwmqe}
谷歌则无法看到你noindex的标记,因为它无法抓取这个信息。
总结
关于Robots.txt和SEO优化的之间的事情,就分享这么多,您还有疑问可以留言或者加Q群讨论哟。