# 第 2 章 · 让 AI 读得到你的网站：先检查，再修设置

> GEO Playbook · 通用版 v1.0 · Canlah AI · CC BY 4.0 · 网页版：https://canlah.ai/zh/playbook/open-the-door/
> 这是给 AI 助手读的 Markdown 版，内容与网页版相同。图写成代码块（wireframe / mermaid / bars / steps / split）；「→」链接指向网页版对应小节，同名 .md 是它的 Markdown 版。

门是乘数：爬虫进不来，后面写多少页都乘以 0。`nosnippet` 开着，Google 那条腿整季按零计；价格写在 JS 里，主流 AI 爬虫一个字都拿不到。这一章全部免费，半天到一天能做完，但分两次做：2.1–2.5 是 D1 的只读体检，拿权限、记现状，一个字都不改；等 [→ 通用版 4.4 网页对照腿与冻结基线（全书唯一完整规格）](https://canlah.ai/zh/playbook/pick-questions/#g4-4-4-网页对照腿与冻结基线-全书唯一完整规格) 把基线落盘，再做 2.6–2.9 改门。门、人、货架三关的关系见 [→ 通用版 1.3 三个关口与三条路](https://canlah.ai/zh/playbook/how-ai-answers/#g1-1-3-三个关口与三条路)。

**硬闸：基线没落盘，不改任何门、档案、事实页。**

## 2.1 五道闸总览与闸零：访问日志（只读）

**这一节要你做的**：先看清门为什么分两次做；D1 第一件事发出权限申请，拉出《爬虫命中表》，按四条读法把问题记成待修项。做完手上多一张命中表和一张待修清单，门一处没动。

```mermaid id=read-then-fix 图：先只读、冻基线，再改门，前后才可比；顺序一反，冻到的就是被自己改过的货架
flowchart LR
  d1["D1 只读体检"] -->|一个字不改| fz["冻基线 4.1–4.4"]
  fz -->|Top 20 与噪声带| ld["基线落盘"]
  ld --> fix["改门，记分界日"]
  fix -->|同一个分母去数| ok["前后可比"]:::hl
  bad["先改门再冻基线"] --> dirty["冻到被自己改过的货架"]
  dirty --> no["前后不可比"]:::warn
```

为什么非这样不可：基线要记的是页型占比、逐 URL 的四态、问法形状，这些都是在「门还是原样」的货架上量出来的。门先修了再冻，before 样本里已经混进了你自己的改动，之后任何「涨了」都说不清是门的功劳还是本来就会涨。所以施工顺序（门排第一）和测量顺序（冻结排第一）是两件事，不许混。D1 能做、且不算改动的事只有三类：申请权限、开日志、记现状。全书周次从改门那天起算，见 [→ 通用版 0.1 全书一句话与 90 天翻书顺序](https://canlah.ai/zh/playbook/start/#g0-0-1-全书一句话与-90-天翻书顺序)。

```steps 图：五道闸按同一个顺序过两遍：D1 只看不改，基线落盘后照这个顺序改
闸零 | 访问日志 | D1 拉表；拿不到就开阻塞项
闸一 a | 摘要开关 | nosnippet 三兄弟，D1 grep，2.6 改
闸一 b | robots | D1 记六行，2.6 四步合并
闸一 c | WAF | D1 看 403/429，2.6 加白名单
闸二 | 四身份实抓 | D1 各留一份回执
闸三 | 收录与数据 | D1 接后台，2.7 提交
闸四 | JSON-LD | 2.7 半天封版
```

两条排序规则：

1. **闸零排在所有闸之前。** 它是唯一的直接证据，而且是唯一一件「动手只要半小时，拿权限可能要几天」的活。开工第一封邮件一次约齐三样权限：**域名验证、robots 改动权限、访问日志导出权限**。
2. **闸三先接免费第一方数据，再花钱探测**（见 2.5）。反过来等于把本来免费的东西当成新发现。

### 闸零怎么拉

UA 伪造、`site:` 查询、浏览器目视，全是间接证据，而且两个方向都会出错。没有访问日志，整个技术门层就建立在推断上。

```steps 图：拉日志四步；认爬虫只认 IP 段，因为 UA 字符串谁都能伪造
拉 30 天 | 原始日志 | Cloudflare Logpush 或主机 access.log
取 IP 段 | 官方公开段 | OpenAI、Anthropic、Perplexity
CIDR 过滤 | 按 IP 认 | 不按 UA 字符串认
出命中表 | 四列 | 落盘 crawler_hits_30d.csv
```

OpenAI 的三份 IP 段是 `openai.com/searchbot.json`、`openai.com/gptbot.json`、`openai.com/chatgpt-user.json`；Anthropic 与 Perplexity 用各自官方公布的段。按 UA 数出来的命中次数里混着扫描器和伪装流量，判据整条作废。命中表四列（爬虫名、30 天命中次数、命中 URL 前 20、返回码分布）的模板见 [→ 通用版 B.1 开门模板](https://canlah.ai/zh/playbook/templates/#g14-B-1-开门模板)。

**拿不到时的两种退路**：拿不到导出权限 → 当天开工单、列**红色阻塞项**，闸二先用判准 b–d 顶上（见 2.3）；站点压根没留日志 → 当天开 Logpush / access log，**30 天后才有第一张表**。

### 命中表怎么读

```mermaid 图：命中表上的每一种读数只对应一条待修项；基线落盘前只记不改
flowchart LR
  t["爬虫命中表"] --> c1["OAI-SearchBot 命中为 0"]
  c1 -->|判| f1["门没开，记待修 2.6"]:::warn
  t --> c2["403 与 429 合计超 5%"]
  c2 -->|判| f2["WAF 在挡，记待修 2.6"]
  t --> c3["全 200 但只中首页"]
  c3 -->|判| f3["sitemap 与内链，记待修 2.7"]
  t --> c4["ChatGPT-User 有命中"]
  c4 -->|判| f4["实时腿通了，记月度"]:::hl
  t --> c5["拿不到日志"]
  c5 -->|只许写| f5["无直接证据，30 天后补"]:::warn
```

图外的三条纪律：

- **`OAI-SearchBot` 为 0 这一层，不许写「选题不对」，也不许跳到「换题」那一层。** 门没开或站点压根没被发现，是门的问题。
- **403 / 429 是 WAF 或速率规则在挡，不是 robots。** 去改 robots 修不好它。
- **这张表同时是三样东西**：闸二的判准 a、每月排查的第一条判据、「这条腿到底通没通」的唯一直接证据。拿不到日志时不要说「门是通的」，首行注明补交日期。这一层没有证据就说没有证据，是全书的表达纪律（见 [→ 通用版 D.1 数字纪律：数字怎么标、什么只能自己看](https://canlah.ai/zh/playbook/glossary/#g16-D-1-数字纪律-数字怎么标-什么只能自己看)）。

每一种读数怎么修，见 2.9 的两张诊断图。

## 2.2 闸一只读体检：nosnippet、robots、WAF 各看什么

**这一节要你做的**：花 10 分钟 grep `nosnippet` 三兄弟，再花半小时按六行记下 robots 与 WAF 的现状。做完手上多一份《门读检六行》和 8 张截图，只记不改；记下的每一项都在 2.6 改。

### 先查 nosnippet，再看 robots

Google 官方文档写明：要限制页面内容在 Search（**含 AI 概览与 AI Mode**）里展示，用的就是 `nosnippet`、`data-nosnippet`、`max-snippet`、`noindex`（developers.google.com/search/docs/crawling-indexing/robots-meta-tag）。这是 **Google 腿上唯一能一键把你归零的开关**，而 CMS 模板和 SEO 插件经常默认打开它。10 分钟查完，先查它。

对 8 页做：首页、价格页、`/facts` 页，加 5 个模板页（服务页、执业人或作者的个人页、一篇旧博文、一个列表页、一个落地页），逐页 `curl` 取 **HTML + 响应头**。

```split 图：nosnippet 三兄弟藏在三个地方，只看 HTML 会漏掉响应头那一处
查哪里 || 命中长什么样
HTML 的 meta robots / googlebot || nosnippet 或 max-snippet:0 / :20
HTTP 响应头 X-Robots-Tag || 同上；要 curl -I 才看得见
正文关键段的标签属性 || data-nosnippet；价格表、FAQ 答案、事实块最常中
```

D1 的回执：三处 grep 结果（全空，或命中哪一处、哪一页），8 页各一张截图。**这个开关改版、换模板、插件更新之后会被重新打开**，所以它也是每月门层排查的固定动作（见 2.9）。

> ⚠️ 很多人把 `Google-Extended` 当成 AI 概览的开关，花力气论证放不放它，却漏掉了这个真开关。为什么不是它，见 2.4 的四条误解。

### robots 与 WAF：记六行

```steps 图：只读体检六行，缺一行都不算查过；第 2、4、6 行各连着一条会让整季白做的失效路径
1 | 检索 UA | 12 个逐个记放行或被挡
2 | 通配段 N | Disallow 行数 N，原文逐行抄下
3 | 训练 UA | 6 个，一律标与能不能被引无关
4 | 摘要开关 | 首页与价格页 curl -I 看三处
5 | CDN/WAF | Block AI bots、429、白名单
6 | 访问日志 | 有没有，导出权限申请日期
```

那三条失效路径分别是：第 2 行不记，合并 robots 时就会解除原有保护（2.6）；第 4 行漏了，`nosnippet` 开着没人发现，Google 腿本季按零计；第 6 行没问，闸零没法当天开工，整个门层只剩推断——所以这一行问得越早越好。

第 5 行要落三样：①「Block AI bots」/「Bot Fight Mode」开关是开、关还是无此功能；② 速率规则会不会把爬虫打成 429（对照闸零表里的 429 占比）；③ `openai.com/chatgpt-user.json` 的 IP 段在不在白名单里。

每行去哪查：第 1、3 行打开 `https://<域名>/robots.txt` 逐段读；第 5 行看 CDN / WAF 后台；第 6 行问运维，记「有 Logpush / 有 `access.log` / 没留日志」。六行依次约 10、5、5、10、10、5 分钟。12 个检索 UA 与 6 个训练 UA 的名单和用途见 2.4；空白记录表见 [→ 通用版 B.1 开门模板](https://canlah.ai/zh/playbook/templates/#g14-B-1-开门模板)。

> ⚠️ **robots 放行不等于真放行**——CDN / WAF 那层会在 robots 之外直接 403（**推断，把握度 85%**）。读检判「放行」只是纸面第一层；真放行的证据只有闸零的《爬虫命中表》。

## 2.3 闸二：实抓的四身份（只读）

**这一节要你做的**：不再用 `curl -A` 看内容判门，改从四条通路看同一个 URL，按四条之间的差值判出是 CSR、WAF 还是门没开。做完手上多四份独立回执，不许混成一张。

```split 图：用 curl -A 伪装成爬虫看返回内容，两个方向都会判错
假阴：你判「挡了」 || 假阳：你判「通了」
WAF 按 IP + rDNS 放行已验证爬虫 || 站点对非浏览器 UA 回一个 SSR 降级版
你从办公室伪造 UA，被当伪装爬虫拦掉 || 真实检索路径拿到的却是 CSR 版
于是去修一个没坏的东西 || 于是整季往 AI 读不到的页上写
```

`curl -A "OAI-SearchBot"` 只证明你的基础设施对这个字符串怎么反应。左边那种放行方式不是假设：Cloudflare Verified Bots 就是按 IP + rDNS 放行的。

### 四身份：同一个 URL 被四条通路看到的样子

按可信度排，全部免费。

| 身份 | 从哪拿 | 通过判据 | 它只能证明什么 |
|---|---|---|---|
| **a · 真爬虫看到的** | 闸零的访问日志，按 `openai.com/searchbot.json` 等官方 IP 段 CIDR 过滤 | 这个 URL 30 天内被 `OAI-SearchBot` 命中过**且返回 200** | **唯一的直接证据**，全腿通用 |
| **b · Bing 抓到的 HTML** | Bing 站长工具 → URL Inspection → **Live Test** 返回的源码 | 源码里**字符串搜得到价格数字和正文那一段** | Bing / Copilot 腿；也是最接近「不渲染的爬虫看到什么」的免费样本 |
| **c · Google 抓到的 HTML** | GSC → URL 检查 →「**已抓取的网页**」HTML | 同上，字符串搜得到 | **只证明 Google 侧**（Google 会渲染），不许单独作结论 |
| **d · ChatGPT 实时通路看到的** | 在 ChatGPT 里贴这个 URL，原话：「打开这个链接，把页面上写的价格那一行原文抄给我」 | 能**逐字**复述（不是转述、不是估算） | `ChatGPT-User` 这条实时腿通了 |

`curl` 不是第五个身份，是排查手段，而且必须拆两次读：① 用**普通浏览器 UA** 取 HTML，看有没有正文和价格——这才是判 CSR 的正确姿势，**CSR 与 UA 无关**；② 再用 `OAI-SearchBot` UA 跑一次，**只看状态码，不看内容**，判 WAF。两次分别截图，回执上写明「**排查用，不作通过判据**」。半天快启版（[→ 通用版 4.8 两条捷径与本章 checklist](https://canlah.ai/zh/playbook/pick-questions/#g4-4-8-两条捷径与本章-checklist)）里判 JS 也照 ① 做。

### 四条之间怎么读差值

```mermaid 图：四身份判读树：结论来自四条之间的差值，不是逐条打勾
flowchart LR
  a{"日志里 a 怎样"} -->|命中且 200| pass["过"]:::hl
  a -->|全 0| shut["门没开或没被发现"]:::warn
  a -->|403 429 超 5%| waf["WAF 或速率规则在挡"]
  a -->|没有日志| cb{"c 通而 b 不通吗"}
  cb -->|是| csr["CSR 依赖"]:::warn
  cb -->|否| bd{"b 通吗 d 通吗"}
  bd -->|都通| low["过，降级"]
  bd -->|b 通 d 不通| waf
  bd -->|其余组合| wait["不下结论，补 a"]
```

图外要补的：

- **「过，降级」首行必须标「无直接证据，30 天后补 a」。**
- **CSR 依赖** = Google 渲染得出来，不渲染的爬虫拿不到。记成待修项、当天开 SSR / 预渲染工单；页面类工作整体后移，本月不新增内容页。
- **WAF 那一格不许去改内容**，它归 2.6 的 WAF 白名单。
- **门没开那一格**不许写「需求不存在」，也不许跳到「换题」。

D1 做的是体检。改门之后第 7 天（2.6），四条回执各重拉一次，和 D1 那四份并排作对照。

## 2.4 爬虫用途表与逐腿判门（只读）

**这一节要你做的**：分清 12 个检索爬虫和 6 个训练爬虫、挡了哪个断哪条腿；遇到平台、多子域、登录墙或多语言站，一条腿一条腿地判门。做完手上多一张《逐腿门态表》：一行一台主机，一列一条腿，不许合并成一格。

这是整章最容易判错的一格：挡错了没事，放错了整季白干。

```split 图：检索腿挡了就断一条腿；训练腿全部 Disallow 也不影响任何一条检索腿
检索腿（12 个） || 训练腿（6 个）
决定你能不能出现在 AI 答案里 || 只关内容授权，与能不能被引无关
OAI-SearchBot 挡了，ChatGPT 腿整季为零 || GPTBot 挡了，照样可能被引
Googlebot 挡了，AI 概览连自然排名一起没 || Google-Extended 不管 AI 概览
放不放：放 || 放不放：自己决定
```

### 12 个检索腿：挡了会怎样

| 爬虫 | 归谁 | 挡了会怎样 |
|---|---|---|
| `OAI-SearchBot` | OpenAI | **ChatGPT 这条腿整季为零** |
| `ChatGPT-User` | OpenAI | 用户在 ChatGPT 里点开你的页时读不到。⚠️ **真开关在 WAF，不在 robots**（2.6） |
| `OAI-AdsBot` | OpenAI | 只影响跑广告的场景；不跑广告可以不放 |
| `Bingbot` | 微软 | Copilot 直接断；ChatGPT 八路检索源里少一路 |
| `Googlebot` | Google | **AI 概览 / AI Mode 与自然排名一起没**——三者共用同一个爬虫 |
| `Applebot` | Apple | **Siri / Spotlight / Apple Maps / Apple Intelligence 整条腿断**。⚠️ 这一段没放行，就别去认领 Apple Business Connect 档案 |
| `Amazonbot` | Amazon | Alexa / Amazon 侧检索断 |
| `PerplexityBot` | Perplexity | Perplexity 腿断 |
| `ClaudeBot` | Anthropic | Claude 侧断 |
| `Claude-SearchBot` | Anthropic | Claude 检索断 |
| `Claude-User` | Anthropic | 用户在 Claude 里点开你的页时读不到 |
| `DuckAssistBot` | DuckDuckGo | DuckAssist 断 |

6 个训练腿：`GPTBot` · `Google-Extended` · `Applebot-Extended` · `Meta-ExternalAgent` · `CCBot` · `Bytespider`。放不放行是内容授权问题，不是可见度问题。

```split 图：四条最常见的误解，都是把训练腿和检索腿、或把两家的规矩混成了一件事
误解 || 事实
屏蔽 GPTBot 就保护了内容，或就被 AI 封了 || GPTBot 是训练腿；88.2% 屏蔽它的站照样被引
放行 Google-Extended 就开了 AI 概览 || AI 概览与 AI Mode 看 Googlebot + nosnippet
Applebot-Extended 被封，Apple 腿就断了 || 它只是训练退出开关；Apple 腿看 Applebot
AI 爬虫都不守 robots，改了也没用 || Anthropic 三个 bot 全守；ChatGPT-User 才相反
```

第一条的反面才是真正致命的：把 `OAI-SearchBot` 和 `Bingbot` 挡在门外。第二条最贵，凭的是 Google 自己的两句原话。爬虫文档：「**Google-Extended does not impact a site's inclusion in Google Search nor is it used as a ranking signal in Google Search.**」《AI features and your website》写死入场资格：「**a page must be indexed and eligible to be shown in Google Search with a snippet**」，且「**robots.txt directives for Googlebot is the control**」。所以 AI 概览的闸门是 `Googlebot` + `nosnippet` 三兄弟。第四条的意义在省事：Anthropic 三个 bot（`ClaudeBot` / `Claude-SearchBot` / `Claude-User`）改 robots 就真生效，不用碰 WAF。88.2% 出自 BuzzStream，其余出处见 [→ 通用版 A.5 出处清单](https://canlah.ai/zh/playbook/evidence/#g13-A-5-出处清单)。

```mermaid 图：判哪条腿就看哪个 UA；看错 UA，会得出「已放行」或「进不去」两种相反的错结论
flowchart LR
  q{"要判哪条腿"} -->|AI 概览与 AI Mode| g["Googlebot + nosnippet"]:::hl
  q -->|Gemini App 里的引用| ge["Google-Extended"]
  q -->|Apple 腿| ap["Applebot"]
  q -->|ChatGPT 检索| o1["OAI-SearchBot"]
  q -->|ChatGPT 实时点开| o2["ChatGPT-User"]
  q -->|Claude 检索| c1["Claude-SearchBot"]
  q -->|Claude 实时点开| c2["Claude-User"]
  q -->|Perplexity 检索| p1["PerplexityBot"]
  q -->|Perplexity 实时点开| p2["Perplexity-User"]
  q -->|Copilot| bb["Bingbot"]
```

**零 JS 执行的推论**：主流 AI 爬虫不执行 JS，例外只有 Gemini（走 Google 基建全量渲染）和 Applebot（证据见 [→ 通用版 1.1 买家怎么问，AI 读什么](https://canlah.ai/zh/playbook/how-ai-answers/#g1-1-1-买家怎么问-AI-读什么)）。所以价格、核心事实、正文段落必须在服务端渲染好的 HTML 里，用浏览器 UA 取源码就能字符串搜到；写在 JS 里，后面 90 天全白做。同一条推论的另一面：实时抓取不读 JSON-LD，schema 是基线不是杠杆（2.7）。这个例外还给了全书最有用的一条排查判据：**Google 腿有席位而 ChatGPT 腿为零，这个差值本身就是 CSR 的指纹。**

### 逐腿判门

```mermaid 图：判一条腿的门：robots 没封不等于抓得到，只有裸抓 200 且正文命中才记「可达」
flowchart LR
  f{"robots 取到了吗"} -->|取不到| nf["记未取到，换出口重取"]:::warn
  f -->|取到| s{"该 UA 有专段吗"}
  s -->|有| seg["按专段判"]
  s -->|没有| wild["落通配段，不是被封"]
  seg --> r{"封了吗"}
  wild --> r
  r -->|封了| shut["这条腿记封"]
  r -->|没封| raw{"该 UA 裸抓一页"}
  raw -->|200 且正文命中| ok["记可达"]:::hl
  raw -->|被拦| blk["记实抓被拦，附状态码"]
  raw -->|没做| unk["只写 robots 未封，可抓性未验"]
```

图外的记档规则，一条都不许省：

1. **robots.txt 自己 `curl` 全文下载后逐段解析，按日期记档。** 只 grep 一个关键词，会漏掉「这个 UA 根本没被单列」这件最关键的事。
2. **去页面所在的那台主机查 robots，不是主域。** 详情页、文档站、帮助中心常在另一台主机或子域上，robots 与主域**不共享**。
3. **一行一台主机、一列一条腿，不许合并成一格。** 同一个平台完全可能某几条腿封、另几条腿开，合并成一格就会整条链被扔掉。
4. **`Google-Extended`、`Applebot-Extended`、`Meta-ExternalAgent` 是训练 / 授权腿，不进这张表。**
5. **表上必须带「验证等级」一栏**：`robots 实测` / `裸抓实测`。裸抓回执只许写「实抓 200 + 正文命中」或「实抓被拦（附状态码）」，不许写「已放行」。robots 只解除协议层禁令；CSR 渲染和 WAF / 地域风控（403、验证码、跳转）是另外两道闸，它们不写在 robots 里。
6. **平台 robots 会变**，记进《站外资产腐烂表》，**每季度重跑一次**。连接被拒、超时、TLS 握手失败，一律记「未取到」，重取不到就空着，**不许猜填**。
7. **平台封门 ≠ 该平台没有销量价值。** 判死的只是「某条腿上的引用」，不是生意；别的腿、以及走数据 feed 的购物货架可能照常出现。对外说话时这两件事不许混。

某条腿被封的主机，那条腿上不排任何内容工作，验收也不许把它算进席位。这里判的只是门开没开，和 [→ 通用版 4.6 四态、两层分母与弃权线](https://canlah.ai/zh/playbook/pick-questions/#g4-4-6-四态-两层分母与弃权线) 判「一个 URL 进不进得去」是两件事。可复现的逐平台 robots 命令见 [→ 通用版 B.1 开门模板](https://canlah.ai/zh/playbook/templates/#g14-B-1-开门模板)。

> **举例**（培训）2026-09-21 实测新加坡官方培训门户 TPGateway 的 robots.txt：`User-agent: *` → `Disallow: /`；后面的 `Allow: /` 段只列 `Googlebot`（含 Image / Video / mobile）、`Slurp`、`bingbot`、`Applebot`、`Twitterbot`、`Pingdom`。`GPTBot` / `OAI-SearchBot` / `ChatGPT-User` / `ClaudeBot` / `PerplexityBot` 一个都不在里面，全部落 `Disallow: /`。→ Google、Apple、Bing 三腿开，OpenAI、Anthropic、Perplexity 三腿封：只为前三腿做、只在前三腿上验收，ChatGPT 侧席位不计。

### 五种站点形态，各多查一样

| 站点形态 | 多查什么 | 判据与处置 |
|---|---|---|
| **单页应用 / 客户端渲染** | 普通浏览器 UA 取 HTML，grep 正文里一句实际文字 | 找不到 = 正文不在 HTML 里。关键正文改服务端渲染或预渲染，不许「等 SEO 改版一起做」 |
| **多子域** | 逐子域各 `curl` 一份 robots，一个子域 × 一条检索腿一格 | 缺回执的子域，其页面本季不算「已开门」、不许计入交付。文档站、帮助中心、信任页同样要开门并服务端渲染 |
| **登录墙 / 询价墙** | 关键数字在不在墙外 | **墙后的字对 AI 等于不存在**：做一份公开可核的摘要页或主域镜像 |
| **多语言站** | 每种语言各跑一遍四身份 | 不许只查一种语言 |
| **价格、库存变得极快** | 这些字段是不是靠客户端脚本注入 | 是 = 等于没有 |

**两个病因分开判，顺序不许反**：先看 robots 回执（逐子域 × 逐腿一次 `curl`，最便宜）——某个子域漏改时，被封的那条腿是零、没被封的腿正常，改一行字就好；robots 全绿之后才查 CSR。顺序反了，就会在一个 robots 一行字能修好的问题上排一整季的工程改造。两条都修完，那条腿才从 0 变 1。

> **举例**（B2B 软件）站点天然多子域：`www` / `docs` / `help` / `blog` / `status` / `app` / `trust`，每个子域各查一份 robots，主域全绿不代表 docs 全绿。

## 2.5 闸三只读：接上两个免费 AI 报告

**这一节要你做的**：D1 就接上 GSC 的生成式 AI 报告和 Bing 站长工具的 AI Performance，各真读一次，并核对返回的站点字段是自己的站。做完手上多两份全案唯一免费、第一方、不可伪造的数据；读完才开探测预算。

```steps 图：接两个后台五步；读错站点比没接更糟，因为工具会静默读到别的站还返回 ok
1 | 约权限 | 域名验证，与日志权限同一封信
2 | 开 GSC 报告 | 生成式 AI 表现，导出 CSV 并截图
3 | 开 Bing 报告 | 站长工具 AI Performance，同上
4 | 真读一次 | 核站点字段，配错会静默读到别的站
5 | 落盘 | 两张接入截图，读法见 4.2
```

三条规矩：

- **站点字段核不对 = 这一格没做，不许标完成。** 站点参数没配对时，工具会读到另一个站还照样返回 ok，这比没接更糟：你会拿别人的数当自己的基线。GA4 等其他只读后台同理。
- **域名验证权限拿不到，就列红色阻塞项。** 它挡的不只是这一格：Bing 收录提交（2.7）、Bing Live Test 与 GSC 已抓取的网页（2.3 的 b、c）都要先过域名验证。
- **这一节只接入、只读。** 两份报告怎么读、各拿什么、各有什么坑，只在 [→ 通用版 4.2 题池：三十句从哪来、怎么配、怎么签](https://canlah.ai/zh/playbook/pick-questions/#g4-4-2-题池-三十句从哪来-怎么配-怎么签) 写一次；Bing 收录查漏与 IndexNow 提交是改动，放在 2.7。

同一天顺手开工的另一件免费的事，是从前台记录或 CRM 抄最近 15 单成交前买家问过的原话，它是题池唯一的 A 类来源，做法同样见 4.2。

## 2.6 改门：nosnippet、robots 四步合并、WAF 白名单

**这一节要你做的**：先确认基线已落盘，再在同一天按 `nosnippet` → robots → WAF 的顺序改完，把改门那天记成分界日。硬闸照旧：**基线没落盘，不改任何门、档案、事实页。** 做完手上多一份合并后的 robots.txt、一句写着 N × 12 的回执和一条 WAF 白名单规则。

```steps 图：改门当天按这个顺序走，分界日从这天起算；前置不满足，后面一步都不动
前置 | 基线已落盘 | Top 20、噪声带、36 次品牌六问
闸一 a | nosnippet | 三处改回，grep 全空
闸一 b | robots | 四步合并，回执写 N × 12 原句
闸一 c | WAF | 加 chatgpt-user.json 的 IP 段
记分界日 | 改门当天 | 写进注册表
D+7 | 重拉复检 | 日志看 ChatGPT-User，四身份重拉
```

改门那天是全案的分界日，所有「改门前 vs 改门后」的对比都以它为界；每一页另有自己的分界日，即页面上线日（2.8）。全书周次的 W1 也从这天起算。

### 闸一 a · nosnippet

```split 图：三处命中各有一个改法，改完再 grep 一遍三处全空才算过
命中在哪 || 怎么改
meta robots / googlebot 里的 nosnippet 或小数字 || 改成 max-snippet:-1
响应头 X-Robots-Tag || 在 CDN / 服务器层去掉，或改成 max-snippet:-1
正文标签上的 data-nosnippet || 删掉这个属性
```

**任一命中而四周内不改 → Google 腿本季按零计**，写进首行，月度记录里 Google 那格标「开关未解除」。

### 闸一 b · robots 四步合并

```mermaid 图：直接在 robots 末尾追加具名段，会让这些爬虫脱离通配段，原有的保护对它们全部失效
flowchart LR
  add["追加一个具名段"] -->|最具体的段胜出| only["该爬虫只认自己那段"]
  only -->|其他段全部忽略| lost["通配段的 Disallow 失效"]
  lost --> leak["后台与参数页进 AI 检索"]:::warn
```

被放出去的通常是 `/wp-admin/`、`/cart/`、`/?s=` 这类路径。后果不是排名不动，是后台路径和参数页进了 AI 检索。

```steps 图：robots 合并四步，顺序不许反；第 3 步不做等于解除原有保护
1 | 抄通配段 | Disallow 逐字抄下，记行数 N
2 | 写检索段 | 12 个具名段，每段 Allow: /
3 | 复制 N 行 | 进每一个具名段，数够 N × 12
4 | 收尾 | 训练段单列，Sitemap 行放末尾
```

`Sitemap:` 行放末尾，是因为它不属于任何 group。训练段放不放自己决定，但写 `Allow: /` 的训练段同样要带那 N 行。**回执里必须逐字记这一句：**

> 原通配段 `Disallow` 行数 = **N**，已逐行复制进 **N × 12** 处（12 个检索类具名段）；训练段中写 `Allow: /` 的，同样复制。

**这句话不在回执上，闸一不算过。** 检索 12 段 + 训练 6 段的 robots 母本全文，只有 [→ 通用版 B.1 开门模板](https://canlah.ai/zh/playbook/templates/#g14-B-1-开门模板) 里那一份，交给改站的人直接从那里复制；母本里的 `<N 行 Disallow>` 是占位符，必须换成第 1 步抄下的原文，一行不少、每段都要。

**不肯改 robots → 整个站点层工作降为只读监测。**

> `Perplexity-User` 不进母本。Perplexity 官方爬虫文档原文：「Since a user requested the fetch, this fetcher generally ignores robots.txt rules.」（https://docs.perplexity.ai/guides/bots）。它和 `ChatGPT-User` 一样，robots 管不住；要放行只能在 WAF 加它的官方 IP 段（同一页公布为 https://www.perplexity.com/perplexity-user.json）。

### 闸一 c · WAF：ChatGPT-User 的真开关

```split 图：对 ChatGPT-User，robots 里的 Allow 只是声明，真开关在 WAF
robots 里写 Allow: / || WAF 白名单加官方 IP 段
无害，但对 ChatGPT-User 无效 || 真开关，7 天后日志可验
OpenAI 原文：robots.txt rules may not apply || 规则名写 allow-chatgpt-user
只改这边：以为门开了 || 实时通路其实还关着，ChatGPT-User 命中 0
```

OpenAI 官方原文完整的一句是：这类抓取由用户动作触发，「Because these actions are initiated by a user, robots.txt rules may not apply」。WAF 这边当天做三件，各留截图：

1. 「Block AI bots」/「Bot Fight Mode」开关的状态截图。
2. 速率规则：把已验证爬虫移出速率规则，截图并附闸零表里的 429 占比。
3. 白名单：`openai.com/chatgpt-user.json` 的 IP 段加进去，规则名 `allow-chatgpt-user`，截图。

**D+7 复检**：重拉日志，看 `ChatGPT-User` 有没有命中；2.3 的四条回执同日各重拉一份，和 D1 那四份并排存。

## 2.7 闸三闸四：收录通路与 JSON-LD 一次封版

**这一节要你做的**：收录按两条腿分开处理——Bing 腿用 IndexNow，ChatGPT 腿用档案认领与贴 URL 复述；再花半天把全站 JSON-LD 一次封版，此后不进每页检查。做完手上多两格收录回执和一份封了版的 schema 模板。

### 闸三 · 收录分两格

```split 图：收录分两格不许合并：Bing 收录证明不了 ChatGPT 腿读到了你
Bing 腿 || ChatGPT 腿
site: 逐页查收录，缺的用 IndexNow 提交 || Foursquare 认领：类目照官方类目树逐字选
Bing 站长工具看 IndexNow Insights || Foursquare 营业状态要对；Yelp 认领
提交到收录有报告可证，可作回执 || 贴 URL 让 ChatGPT 逐字复述价格行
Copilot 直接用这条腿 || 本地题主走 Foursquare、Yelp、OpenAI 本地索引
IndexNow 只喂 Bing 与 Yandex || 判据是四身份 d，Bing 收录不作判据
```

「ChatGPT 走 Bing 索引」在 2026-09 已不成立：ChatGPT 有多路检索源，Bing 只是其一（证据见 [→ 通用版 A.1 机制、门与人这一层的证据](https://canlah.ai/zh/playbook/evidence/#g13-A-1-机制-门与人这一层的证据)）。所以 IndexNow 照做，但它不是 ChatGPT 腿的开关。认领档案本身是改动，只在基线落盘后做；五处商家档案的完整做法见 [→ 通用版 3.4 第三方资质分级、Wikidata 与五处商家档案](https://canlah.ai/zh/playbook/identity/#g3-3-4-第三方资质分级-Wikidata-与五处商家档案)。`Applebot` 放行已验，是认领 Apple Business Connect 档案的前置条件。

### 闸四 · JSON-LD 半天封版

```mermaid 图：字写进可见 HTML 才会被实时读到；schema 只走 Google 知识图谱这条间接路
flowchart LR
  f["同一组字段"] -->|先写| vis["可见 HTML"]
  vis -->|实时抓取读得到| ai["进 AI 答案"]:::hl
  f -->|后顺手写| sc["schema 与 sameAs"]
  sc -->|间接，仅 Google 腿| kg["Google 知识图谱"]
  sc -->|实时抓取| no["一个都不读"]:::warn
```

顺序反了，会得到一个「字段齐全但 AI 读不到」的站。它那一点间接作用，也只在同样的字段已经写进可见 HTML 的前提下才有；单独做它，收益接近零。加 JSON-LD 后，AI 概览（AIO）引用 −4.6%，是唯一显著的一项，方向为负；另外两个平台不显著（证据见 [→ 通用版 A.1 机制、门与人这一层的证据](https://canlah.ai/zh/playbook/evidence/#g13-A-1-机制-门与人这一层的证据)），所以它是一次性的活：

| 规定 | 内容 |
|---|---|
| **一次性模板** | Organization（或所在行业的 schema 子类型）+ 每位执业人的 Person + sameAs。建站时配一次，**半天封版** |
| **不逐页写、不逐页查** | 不进每页上线检查清单，也不进审稿清单 |
| **只需四项正确** | ① 法定名称与 `/facts` 逐字一致 ② 地址与电话与五处档案逐字一致 ③ 每位执业人的注册号 ④ sameAs 串 |
| **把握度注释** | 模板文件里写一句「**间接、仅 Google 腿、把握度低**」，防止下一个人把它当主杠杆 |

sameAs 串这些：监管或注册号查册页、协会档案页、Google 与 Bing 商家页、ORCID / Scholar、会议讲者页、LinkedIn、Wikidata Q 号。

两条顺带的规矩：❌ 不堆 `FAQPage` schema（它为富结果而做，不进 AI 引用）；❌ 不放 `aggregateRating` 自评分（强监管侧还撞上证言与评分的禁令，举例行业条文明文）。**问答式 H2 和页尾短问答要做，schema 不要堆。**

**唯一的例外**：结构化数据被当作**数据通道**时（例如商品 feed 进购物图谱），它有用，但那是另一条不经过实时抓取的路。「结构化数据有用」只在这个意义上成立，不能据此改动承接页上的任何动作。这一格对客户怎么说，口径句见 [→ 通用版 B.2 口径句与话术](https://canlah.ai/zh/playbook/templates/#g14-B-2-口径句与话术)。

## 2.8 每页上线闸

**这一节要你做的**：每页上线当天过三验、第 7 天做复述测试，全过才标「已上线」，并记下这一页的分界日。做完手上多一条每页从上线到 D90 的时间线，和一本记着上线日期的注册表。

```steps 图：一页从上线到 D90；前四项缺一项都不许标「已上线」，这一页的分界日记上线当天，不是开工日
当天 | 见新标题 | 无痕窗口 + 强制刷新，人眼确认
当天 | 四份一致 | 四份 HTML 里同一段正文与价格都在
当天 | 提交回执 | IndexNow ping，只管 Bing 腿
D7 | 复述测试 | ChatGPT 逐字复述一条独家事实
标已上线 | 记分界日 | 分界日是上线日，不是开工日
D14 | 长视频 | 视频闸，缺了下一页不许开工
D30/60/90 | 同规格比 | 同题池、同引擎、同遍数
```

每一步漏了会怎样：

- **见新标题**漏了：别人打开看到的是旧版。
- **四份 HTML 一致**：用 `OAI-SearchBot`、`Bingbot`、`Googlebot`、普通浏览器四个 UA 各取一份源码，同一段正文和同一个价格字符串都得在。漏了的后果有两种：给机器看另一版，会被判操纵；或者价格根本进不了答案。这一步查的是「四份是不是同一版」，和 2.3 判门用的四身份不是一回事。
- **D7 复述测试**是 ChatGPT 腿的真验收：在 ChatGPT 里原文问一次该页上的一条独家可核事实，或贴 URL 让它逐字复述那一行数字，截图留档。n=1 也成立，它测的是「读到没读到」，不是「排第几」。
- **D14 长视频**不挡「已上线」，挡的是下一页开工；它属于写页的三道机械闸，规格见 [→ 通用版 5.4 三十天写页顺序与三道机械闸](https://canlah.ai/zh/playbook/write-pages/#g5-5-4-三十天写页顺序与三道机械闸) 与 [→ 通用版 6.7 本人口述长视频](https://canlah.ai/zh/playbook/off-site/#g10-6-7-本人口述长视频)。
- **D30 / D60 / D90** 三点必须同规格：同题池、同引擎、**同遍数**。席位数随遍数线性放大，基线 5 轮、D90 跑 10 轮，什么都不做也会翻倍；为什么见 [→ 通用版 7.5 量具纪律：换尺子就不可比](https://canlah.ai/zh/playbook/measure/#g11-7-5-量具纪律-换尺子就不可比)。

每页上线时另登记 2–3 条该页独有的可核事实字符串，每月复测时去找它们，这是全流程唯一能给出页级因果的信号，做法见 [→ 通用版 7.2 噪声带、页级信号与每月十步](https://canlah.ai/zh/playbook/measure/#g11-7-2-噪声带-页级信号与每月十步)。

## 2.9 门层排查与本章验收

**这一节要你做的**：每月复测时席位增量没超噪声带，就从门这一层查起，按两张诊断图把每个症状落到一个修法；席位涨了也照查。最后照十项清单全勾，才算开完门。

**什么时候查**：两个时点。① 席位增量未超噪声带时，从这里开始查，**不许跳层**（分诊的其余几层见 [→ 通用版 7.3 没动分诊与下月三个点](https://canlah.ai/zh/playbook/measure/#g11-7-3-没动分诊与下月三个点)）。② **门这一层每月无条件查一次，席位涨了也要查**：它的失败是静默的，页面根本没被读到时，席位完全可能因为别的原因在涨，等下个月才发现整个月白做。

```mermaid id=door-triage-edge 图：日志、robots、WAF 这一层，每个症状只落到一个修法
flowchart LR
  t["门层症状"] --> s1["OAI-SearchBot 命中为 0"]
  s1 -->|修| f1["闸一三小步，2.6"]
  t --> s2["403 与 429 超 5%"]
  s2 -->|修| f2["白名单并移出速率规则"]
  t --> s3["全 200 但只中首页"]
  s3 -->|修| f3["sitemap、首页内链、IndexNow"]
  t --> s4["后台路径出现在搜索里"]
  s4 -->|修| f4["重做合并，数够 N × 12"]
  t --> s5["Apple 档案没动静"]
  s5 -->|修| f5["先放行并验 Applebot"]
  t --> s6["说 GPTBot 被挡才没被引"]
  s6 -->|判| f6["误判，别拿它当判据"]:::warn
```

```mermaid id=door-triage-render 图：渲染、收录、nosnippet 这一层：Google 有席位而 ChatGPT 为零，先查 CSR 不查选题
flowchart LR
  s1["Google 有席位、ChatGPT 为零"] -->|先查| csr["CSR 依赖"]:::hl
  s2["四身份 c 通、b 不通"] -->|判| csr
  csr -->|修| ssr["开 SSR 或预渲染工单"]
  s3["四身份 b 通、d 不通"] -->|判| waf["WAF，回边缘层那张图"]
  s4["改版或换插件后席位掉"] -->|判| ns["nosnippet 复发"]
  ns -->|修| m1["三处改回 max-snippet:-1"]
  s5["席位没动，原因不明"] -->|按序| five["查五样，见下文"]
  five -->|任一不过| door["是门问题，不是选题"]:::warn
```

「原因不明」时按顺序查的五样：① 访问日志有没有真 `OAI-SearchBot` 命中、返回码是什么 ② `nosnippet` 三兄弟有没有被 CMS / 插件重新打开 ③ 四份 HTML 逐字一致 ④ `site:` 查 Bing 收录 ⑤ 在 ChatGPT 里贴 URL 让它逐字复述价格那一行。

两张图之外的纪律：

- **任一不过：当天修，7 天后复检，本月不换题、不新增内容页。**
- 403 / 429 那一格**不许去改内容**。
- **不许跳过门这一层直接写「需求不存在」。连续两个月停在同一层没修好，是执行的问题，不是题目的问题。**
- **五道闸每个行业都必做。** 另有两项按站点形态加做：**CSR 体检**（价目表、课表、文档站、筛选与价格组件这类前端组件渲染的内容，浏览器 UA 取 HTML 看正文在不在）；**可见正文体检**（检索腿 UA 裸抓，剥标签后数可见正文字符数与独立陈述句条数——有数字没句子的页，答案货架上整页进不去）。

> **举例**（电商）可见正文体检是强制项，陈述句 < 12 条的页不许标「已上线」；一张品类页 HTML 很大、剥完标签可见正文只剩一小截的实测，见 A.1。

### 本章验收清单

门是乘数，不是变量：它只有 0 和 1 两个值，而且没有证据就算 0。照着打勾，全勾才算开完门：

- [ ] 《爬虫命中表》四列填满，落盘 `crawler_hits_30d.csv`；拿不到日志的，已列红色阻塞项并写明补交日期
- [ ] `nosnippet` 三处 grep 全空，8 页各一张截图
- [ ] `robots.txt` 12 个检索类具名段齐，回执上写有「**原通配段 `Disallow` 行数 = N，已逐行复制进 N × 12 处**」
- [ ] `Sitemap:` 行在文件末尾
- [ ] WAF 白名单规则 `allow-chatgpt-user` 已加，截图留档；7 天后复检 `ChatGPT-User` 有命中
- [ ] 闸二四条判准**各一份独立回执**，没有混成一张；`curl` 的两次读分别截图并写明「排查用，不作通过判据」
- [ ] Bing 站长工具 AI Performance + GSC 生成式 AI 报告两个后台都已接入，各一张截图
- [ ] JSON-LD 模板半天封版，之后不再逐页写
- [ ] 每一页上线都过了上线闸（当天三验 + 第 7 天复述），上线日期已记
- [ ] 门这一层的排查表，已排进每月固定动作

清单里凡是「记现状」的部分都在 D1 做完；凡是动了门的项，都只在基线落盘之后做，改门那天已记为分界日。