robots.txt 挡了 CSS/JS 拖垮索引

你为了"省 crawl budget"在 robots.txt 里 disallow 了 `/assets/` 或 `/_next/static/`,Googlebot 没法渲染。最快的解法:别再 block 渲染资源,然后用 URL Inspection 重测。

一句话先说结论: robots.txt 里某条 Disallow: 规则把你的 CSS、JS 或 JSON 数据接口挡在了 Googlebot 外面。结果是页面布局崩坏、看不到 JS 注入的内容、还可能被标成 not mobile-friendly。最快的解法:打开 Search Console → URL Inspection → Test Live URLView tested pageMore info → Page resources,找出标了 Blocked by robots.txt 的资源,然后加 Allow: 规则(或直接删掉那条 Disallow:),让 Googlebot 能 fetch 这些路径,再点 Request Indexing。注意 Google 会把 robots.txt 缓存最多 24 小时,所以 live test 比索引报告更快反映你的改动。

你接手了一个 robots.txt,里面 disallow 了 /assets//_next/static//wp-content/plugins/。理由是 “Googlebot 不需要爬静态资源,省 crawl budget”。但 Googlebot 必须 FETCH CSS 和 JS 才能渲染页面。拿不到,它看到的就是一个没布局、半坏的 DOM,分不清正文和模板、跑不了注入内容的 JS,还可能被标 mobile-unfriendly。URL Inspection 会显示 Page resources couldn't be loaded

Google 从 2014 年就明确过:不要 block 影响渲染的 CSS、JS、图片。“crawl budget” 在这件事上的直觉是错的。如今 Googlebot 用的是常青版(evergreen)Chromium 引擎渲染,而且被挡住的渲染资源还会让页面在 AI Overviews 里更吃亏——AI Overviews 提取信号靠的是渲染后的页面,不是原始 HTML。

你属于哪一类?

URL Inspection 里的症状大概率原因跳转
CSS/JS 列在 “Other resources” 里标 Blocked by robots.txtDisallow 规则覆盖了你的资源路径原因 1、2、7
cdn.example.com 上的资源被挡、主域干净CDN 主机自己的 robots.txt 太严原因 3
资源返回 403/401,不是 “blocked by robots.txt”是 WAF/防火墙在挡 bot,不是 robots.txt原因 4
渲染后 HTML 空白、API 调用失败Disallow: /api/ 挡了客户端数据请求原因 6
带版本号的资源 main.css?v=abc 被挡Disallow: /*? 通配符误伤 query string原因 7

常见原因

1. 2010 年风格的 “block /assets/” 老规则

那个指令看起来清爽:别浪费爬虫预算。2010 年 Google 还不渲染 JS 时是对的,2015 年起就过时了。

怎么判断curl https://yoursite.com/robots.txt。看到 Disallow: /assets/Disallow: /static/Disallow: /_next/、或 Disallow: /wp-content/plugins/ 就是它。

2. 通配符规则误伤 CSS

Disallow: /*.json$ 想挡 API 响应,顺带挡了 manifest.jsonwebpack-runtime.json 或构建需要的配置文件。

怎么判断:列出所有 Disallow: /*.<extension> 规则,对照实际静态文件路径逐条测试。

3. CDN 子域自己的 robots.txt 太严

资源在 cdn.example.com。按 Google 的规范,robots.txt 规则只对它所在的那个 host、protocol、port 生效,所以 Googlebot 去 cdn.example.com 拉 CSS 时会读 cdn.example.com/robots.txt。如果没人配过、它返回整站 disallow,那即使主站 robots.txt 干净,这些资源照样被挡。

怎么判断curl https://cdn.example.com/robots.txt。如果是 User-agent: * 后面跟 Disallow: /,资源就被挡在那一侧了。

4. Fastly / Cloudflare WAF 规则挡 Googlebot 访问 /static/

不是 robots.txt,但效果一样。WAF 规则封 bot user-agent 访问资源路径来防 hotlinking,Googlebot 拿到 403

怎么判断curl -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" https://yoursite.com/static/main.css。状态 403 / 401 就是 WAF 在挡,不是 robots.txt。URL Inspection 会把这种报成 fetch 失败,而不是 “blocked by robots.txt”——这个标签上的区别就是你最快的判别点。

5. 代码库里有多份 robots.txt

robots.txt 只有从主机根目录(https://yoursite.com/robots.txt)服务时才有效。放在 https://yoursite.com/app/robots.txt 的第二份会被爬虫忽略;但配错的服务器——比如按路径或按环境返回不同的根内容——还是可能把错的规则推到生产。

怎么判断:在代码库里搜所有 robots.txt。每个主机根目录应该只有一份。用 curl -s https://yoursite.com/robots.txt 确认线上那份。

6. Disallow /api/ 挡了 JS 数据接口

SPA 常见:页面要先 fetch /api/page/foo 才渲染。挡了 /api/,Googlebot 能拉到 JS,但客户端渲染还是出空页面,因为数据请求被挡了。

怎么判断:页面主要靠客户端渲染、并且 robots.txt 里有 Disallow: /api/。在 URL Inspection 里,渲染截图是空白、那些 XHR 接口显示被 block。

7. Disallow: /*? 挡掉资源上的 query string

想去重参数 URL。副作用:带 cache-bust 版本号的资源 main.css?v=abc123 也被挡。

怎么判断:看带版本号的资源 URL。带 ? 的都被这条通配符挡了。

最短修复路径

第 1 步:审计当前 robots.txt

curl -s https://yoursite.com/robots.txt

找出每一条 Disallow:,逐条问:“Googlebot 需要 fetch 这个才能渲染或理解页面吗?” 另外,Google 对 robots.txt 有 500 KiB 上限,超出部分会被忽略——所以一个臃肿的文件里,靠后的规则可能根本不生效。

第 2 步:明确放行渲染必需的资源

把 Googlebot 渲染需要的路径白名单。Google 解决冲突的方式是取最长(最具体)的路径匹配,平手时取限制最少的那条,所以具体的 Allow: 能盖过宽泛的 Disallow:

User-agent: *
Disallow: /admin/
Disallow: /private/

Allow: /assets/
Allow: /static/
Allow: /_next/static/
Allow: /api/articles/
Allow: /wp-content/themes/
Allow: /wp-content/plugins/

把渲染必需的 Allow: 放进 User-agent: * 这一组,这样每个爬虫(包括 Bingbot 和各家 AI 爬虫)都能拿到,而不只是 Googlebot。

第 3 步:用 URL Inspection 验证渲染

老的独立 robots.txt Tester 工具在 2023 年底已被移除,改用下面这两个。

  1. Search Console → URL Inspection → 输入一个关键页面 → Test Live URLView tested pageMore info → Page resources。任何标 Blocked by robots.txt 的资源都在伤害渲染。对照 Screenshot 标签页看页面本该长什么样。
  2. Search Console → Settings → robots.txt report 看 Google 最近一次按主机(前 20 个 host)抓到的文件、抓取状态和解析告警。改完文件后用它的 Request a recrawl 按钮。

第 4 步:核 CDN 的 robots.txt

curl https://cdn.example.com/robots.txt

如果返回整站 disallow,去修 CDN 侧的 robots.txt,或者干脆删掉让它返回 404——Google 把 4xx 响应(429 除外)当成 “没限制、允许爬”。

第 5 步:在 WAF 里白名单 Googlebot

Cloudflare:Security → Bots,放行 Verified Bots 类别(或加一条 WAF skip 规则匹配 cf.client.bot)。Fastly:写一条 VCL 规则,放行 User-AgentGooglebot 的请求。一定要用反向 DNS 校验确认是真 bot(IP 必须反解回 googlebot.comgoogle.com),因为 UA 字符串本身可伪造。

第 6 步:把宽通配符换成精准规则

把过宽的 Disallow: /*.json$ 换成具体路径,比如 Disallow: /api/admin.json。上线前对照实际文件清单跑一遍通配符——/* 通配符会悄悄命中带 hash 的 bundle 文件名和 ?v= query string。

第 7 步:重提,观察

修完 robots.txt,在 URL Inspection 里对几个关键页面点 Request Indexing。因为 Google 把 robots.txt 缓存最多 24 小时,索引报告会滞后,而 live test 立即更新。大约 1-2 周内 Page resources blocked 告警应该回落、页面重新正确渲染。

怎么确认修好了

  1. Live test 通过:URL Inspection → Test Live URL → Page resources 里,没有渲染必需的 CSS/JS 还标 Blocked by robots.txt
  2. 截图正常:URL Inspection 里的渲染截图跟真实布局一致,不是被剥掉样式的版本。
  3. 以 Googlebot 身份直接 fetch 返回 200curl -s -o /dev/null -w "%{http_code}" -A "Googlebot/2.1 (+http://www.google.com/bot.html)" https://yoursite.com/_next/static/css/main.css 应该打印 200
  4. robots.txt report 干净:Settings → robots.txt report 里,每个服务资源的 host 状态都是 Fetched、无 error。

哪些情况可能不是你操作错了

百万级 URL 且服务器吃紧的大站,crawl-budget 的担心是合理的——但解法是站内链接、sitemap 和清理低价值参数 URL,绝不是 block 渲染资源。5 千页的站别套企业级战术。

容易误判的情况

误判成 “JS 没渲染” 问题。症状重叠(rendered HTML 空白),但根因不同:这里是 Googlebot 根本拉不到 JS 或它的数据,不是 JS 跑了没渲染。判别点是 Page resources 里的 Blocked by robots.txt 标签。出现 JS 渲染问题时先看 robots.txt

预防建议

  • robots.txt 默认放行一切,除了 /admin//private/ 和搜索结果页。
  • 永远不要 disallow /assets//static//_next//wp-content/themes//wp-content/plugins/
  • 加一条 CI 检查:抓取 robots.txt 并断言已知资源路径没被 disallow。
  • 上线和迁移时一并校 CDN 主机的 robots.txt
  • 每年随资源路径演进重审一次 robots.txt

FAQ

  • 全放行 Google 会不会因为爬太多惩罚我? 不会。Google 自己自动调爬速,而且静态资源跟 HTML 是分开调度的。放行 CSS/JS 不会显著增加爬取负载。
  • /wp-admin/ 该挡吗? 该——它跟渲染无关。不过 WordPress 默认会放行 /wp-admin/admin-ajax.php,有些主题需要它,所以别不看就一刀切把整个 admin 路径全挡了。
  • 我已经改了 robots.txt,URL Inspection 还显示被挡,为什么? Google 缓存 robots.txt 最多 24 小时。用 Test Live URL(它会重新抓取),再去 robots.txt report 里 request a recrawl 加速。
  • block CSS/JS 会触发人工处罚吗? 不会,这不是处罚——它降低的是渲染质量,进而拉低 Google 对页面的理解和排名,还可能让它掉出 AI Overviews。
  • 在 robots.txt 里写 noindexDisallow 一样吗? 不一样。Disallow 挡的是爬取;Google 会忽略写在 robots.txt 里的 noindex 指令。想让一个可爬的页面不进索引,请改用 noindex meta 标签或 X-Robots-Tag 响应头。

相关阅读

标签: #SEO #排查 #收录 #Search Console #robots-txt #rendering