先分清两道闸门各管什么
robots.txt 管的是抓取:蜘蛛来到站点,先读这个文件,看哪些目录可以进、哪些不要进。meta robots(以及响应头里的 X-Robots-Tag)管的是索引:页面已经被抓到了,再看要不要把它放进索引、要不要跟随页面上的链接。两者写反了,就会出现“抓得到但不收录”,或者“想屏蔽却只挡住了抓取、地址照样能被索引”这类别扭状态。
屏蔽抓取不等于屏蔽索引。用 robots.txt 挡住一个页面,如果别处有链接指向它,搜索引擎仍可能只凭链接把它列进结果,只是没有摘要。真想让它彻底消失,要用 noindex,而且必须是能被抓到的 noindex。
robots.txt 文件本身的自查
- 地址是否能正常访问,返回状态码与内容类型是否正确;返回 404 意味着“没有规则”,返回 5xx 时蜘蛛会保守处理,而返回一个 HTML 页面则是常见事故。
- 只放在域名根目录,子目录里的 robots.txt 不会被读取。
- 路径匹配区分大小写,/Images/ 和 /images/ 是两条不同的规则。
- 是否被 CDN 或缓存策略缓存了旧版本,改完规则后确认线上返回的就是最新内容。
- 测试环境、预发布域名的规则是否在上线时被一起带到了正式站。
- Sitemap 声明是否指向正确的 https 地址,且该文件本身可访问。
规则写法的常见坑
- Disallow: / 一行挡住整站,多出现在临时维护或迁移期间,上线后忘了删。
- 通配符 * 和结尾的 $ 用得太宽,比如 Disallow: /*? 会把所有带参数的地址一起挡住,包括本应保留的正常页面。
- Allow 与 Disallow 冲突时,通常以更具体的规则为准,靠猜不如直接测。
- 按 UA 分组时,组与组之间要空行分隔,否则规则会被并到上一个组里。
- 规则里出现中文、空格或全角符号,容易被解析成无效行。
- 只写了 User-agent: *,却忘了单独放行 CSS、JS 等渲染所需资源。
页面级标记与响应头
meta robots 写在 head 里,属于页面自身声明;X-Robots-Tag 放在 HTTP 响应头里,也能作用于非 HTML 文件。两者都支持 noindex、nofollow、noarchive 等指令,多个值用英文逗号分隔。自查时重点看这几种情况:
- 同一页面既写了 noindex,又写了 canonical 指向别处,方向上不算矛盾,但要确认这确实是你想要的结果。
- 分页页、筛选页、打印页被批量加上了 noindex,后来想收录时没人记得。
- 从模板继承下来的 noindex 没有随栏目上线一起去掉,导致整个栏目长期停在“已发现未编入索引”。
- 响应头里的 X-Robots-Tag 写在服务器或 CDN 配置中,只改页面的 meta 并不会生效。
- nofollow 加在了正文链接上,站内链接关系被顺手切掉。
顺手检查静态资源是否被挡
蜘蛛渲染页面时需要读取 CSS 和 JS,如果 robots.txt 把 /assets/、/static/、/js/ 这类目录整体挡住,页面在渲染视角里可能是残缺的,内容判断也容易出偏差。图片目录被挡通常影响有限,但仍会波及图片搜索,取舍要想清楚。
线上验证的可行做法
- 直接访问站点根目录下的 robots.txt,看返回状态、内容和编码。
- 用站长平台的 robots.txt 测试工具,输入具体 URL,看是被允许还是被拦截。
- 用网址检查或抓取测试功能抓一个代表性页面,看渲染后的 HTML 和抓取状态。
- 再抓一个本应被屏蔽的页面,确认它真的被挡住,别只相信自己写对了。
- 改动规则后隔几天回看抓取统计和索引状态,确认变化符合预期。
可以照着走的自查顺序
- 先看文件能不能正常打开、内容是不是最新的。
- 再逐条读规则,标出通配符和目录级屏蔽。
- 然后抽查页面级 meta 与响应头,重点看栏目首页和模板页。
- 最后做一次实际抓取验证,把结论和日期记进变更记录。
规则类设置最容易“写完就忘”。把 robots.txt、meta robots、X-Robots-Tag 三份配置放在同一张表里维护,标注每条的用途和添加时间,改动时一起过一遍,比出问题后再回头翻配置省事得多。