让 ChatGPT / Perplexity 引用你的站:静态站 GEO 改造全记录,CF 托管 robots 坑了我一整天

阅读时长:10分钟

2026 年,用户问"推荐个 XX",第一反应越来越是问 ChatGPT / Perplexity,不是搜 Google。如果你的站没被 AI 引擎引用,等于在新入口里隐身。

我这边 Hugo 站 900+ 篇文章,去年做了 GEO 改造,想让 AI 引擎抓得动、愿意引。过程踩了 3 个坑,最要命那个 CF 托管 robots.txt 覆盖的问题,折腾一整天才定位。这篇把全链路复盘,给静态站友一份可复现的清单。

TL;DR

  • GEO 不只是"加个 llms.txt"。真正决定 AI 引擎引不引用你的是:AI 爬虫白名单、结构化 Schema、内容可提取度。llms.txt 是辅助。
  • Cloudflare 托管 robots.txt 会覆盖static/robots.txt,不先在 CF 后台关托管,改 2 天都不生效。
  • 2026 行业实测(500M+ LLM bot 流量样本):AI 爬虫绝大多数不抓 /llms.txt,直接爬 HTML。所以别指望它提排名。
  • Hugo 静态站生成 llms.txt + llms-full.txt 走模板,不手工维护,一次配好长期受益。
  • 旧文不改 lastmod(enableGitInfo 不开),改某篇时单独手写 lastmod,比开全局自动改更干净。

GEO 和 SEO 到底差在哪?

传统 SEO 目标:Google 排名靠前,用户点蓝链进你站。

GEO(Generative Engine Optimization)目标:让 LLM 在回答用户问题时引用你、摘你、转述你。用户不一定进你站,但你的内容进了 AI 答案。

机制差异很关键:

维度 传统 SEO GEO
抓取方 Googlebot 为主 GPTBot / ClaudeBot / PerplexityBot / OAI-SearchBot / Google-Extended 等
索引方式 传统倒排索引 RAG 检索 + 生成
内容消费 用户读整页 LLM 抽段落进上下文
可见度信号 排名位 引用率 / 提及率 / 答案采纳

RAG 决定了一件事:LLM 提取信息靠结构化。散在段落的数字、结论、对比,它抓不到;表格、列表、明确 H2 问句、FAQ 区,它才能抽出来喂生成。这也是我改造时内容层跟着动的核心原因。

第一步:AI 爬虫白名单,CF 托管是个大坑

GEO 前提:AI 爬虫能进你站。靠 robots.txt 显式 allow 这些 agent:

User-agent: GPTBot
Allow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Google-Extended
Allow: /

User-agent: Applebot-Extended
Allow: /

User-agent: Bytespider
Allow: /

User-agent: Amazonbot
Allow: /

User-agent: meta-externalagent
Allow: /

我踩的第一个坑在这。Hugo 站放 static/robots.txt,构建后推到 GitHub Pages,理论上生效。结果抓了 2 天,线上 https://你的域名/robots.txt 还是 Cloudflare 默认版本,不是我的。

定位过程

# 抓线上 robots.txt,看返回的是谁
curl -s https://softon.top/robots.txt
# 发现是 CF 托管的默认 robots,不是 static/ 那个

原因:Cloudflare 后台开了托管 robots.txt 功能(CF 侧有"托管 robots.txt"配置项),它会优先返回 CF 那份,覆盖你站点静态文件。我在 Hugo 侧怎么改都没用,因为 CF 在 CDN 层先拦截了。

解法:先去 Cloudflare 后台把托管 robots.txt 关掉,然后改 static/robots.txt 才真正生效。

这一步的教训:CDN 层的配置会盖过源站文件。改静态站 robots 不生效,先查 CDN 有没有托管同类资源(robots、sitemap、404 页都可能被 CDN 劫持)。

第二步:llms.txt 和 llms-full.txt,走模板不手写

llms.txt 是 Jeremy Howard 2024 提的拟议标准,给 LLM 一份"站点内容目录"。我做成两层:

  • llms.txt:站点结构索引(分类 + 说明)
  • llms-full.txt:全站文章列表(标题 + 摘要 + 日期 + 链接),39KB

这两个不手工维护,走 Hugo 模板生成,不然 900 篇文章根本盯不过来。模板读 Site.RegularPages,按分类聚合成 Markdown 列表,构建时一次性吐出到 public/

一个反直觉的行业实测要摆出来(免得大家高估它):

2026 年 5 月,Limy 分析 5.15 亿次 LLM bot 流量事件:AI 爬虫几乎从不 fetch /llms.txt。GPTBot、ClaudeBot、PerplexityBot、OAI-SearchBot、Google-Extended 绝大多数直接爬 HTML,跳过 llms.txt。

也就是说,llms.txt 目前不是 GEO 排名因子。期望"加了 llms.txt 就被 ChatGPT 更多引用"会失望。但它仍是低成本的结构化信号,成本近乎 0,配上不亏。真正提可见度的是下面的 Schema 和内容结构。

llms.txt 必须直接放根路径返回 200,不能 301/302 重定向。PerplexityBot 在 /llms.txt 上不跟重定向,重定向 = 文件不存在。CDN 或子域场景用服务端 rewrite,别用客户端可见 redirect。

第三步:Schema 结构化数据,6 类一起上

LLM 提取信息靠 Schema.org 标注。我在 layouts/partials/head/custom.html 加 6 类:

  • Article:正文
  • BreadcrumbList:面包屑
  • WebPage:页级
  • Person:作者(我)
  • Organization:站点/机构
  • CollectionPage:列表/分类页

落地验证:首页 ld+json count = 1(只有 WebPage),抽一篇正文 /software/... ld+json count = 2(Article + BreadcrumbList + Organization + Person + WebPage)。用 curl 数 application/ld+json 出现次数就能快速校验。

未来文章够多、FAQ 区够密后,再挂 FAQPage schema——那是长期项,不急。

内容层:为什么 H2 要用问句、结论要进表格

改造不止配置层,内容格式也得跟着 LLM 的提取方式调。我给新文章定的规则(已写进工作流):

  • TL;DR 必带:AI 引用 80% 直接抄这段,3-5 条,每条能独立成立
  • H2 用问句 / 痛点句:“为什么 X 慢”,不写"性能分析"。AI 匹配用户问句靠 H2
  • 对比 / 数据进表格或列表:散在段落里的数字 AI 抓不到
  • FAQ 区 5-7 个真实问答:每问 1-3 句答完,为未来 FAQPage schema 留结构
  • 第一人称立场:“我实测"“我踩过”,AI 引擎爱引有立场的原创,不爱汇总

这些不是玄学,是 RAG 检索的实际行为:它抽"结论"时优先读 TL;DR,抽"为什么"时优先读问句 H2,抽"数据对比"时优先读表格。

第四步:lastmod 要不要开 enableGitInfo?

一个纠结过很久的决策,给静态站友讲清楚:

  • enableGitInfo + frontmatter.lastmod:Hugo 按 git commit 自动刷 lastmod
  • 问题:我 900+ 旧文基本不再改,lastmod 永远 = date,开了反而每次 build 都乱跳日期,生成无意义的"最近修改"信号

结论:不开(方案 R)。旧文不改,lastmod 就是 date,天然对。未来哪天真改了某篇旧文,单独在那篇 TOML 手写 lastmod = "YYYY-MM-DD",比开全局自动干净。

踩坑复盘:定位那天的三个动作

把当天最耗时的坑复盘成可复用 SOP:

坑 1:CF 托管 robots.txt 覆盖静态文件 定位三连:① curl 线上 robots.txt 看返回体;② 对比 CF 后台有没有托管 robots;③ 关托管再改源文件。

坑 2:git 仓分叉误报 我 Hugo 源站的 origin remote 以前错指到 Pages 仓,每次部署都报"分叉”。处理:git remote remove originpublic/.git 的 remote 保留(Pages 部署链路靠它)。以后部署不再误报。

坑 3:public/ 旧主题残留 + 900+ 文章未跟踪 git 仓定格在建站初期(4 个古老 commit),900+ 文章、Stack 主题、新 config 全未跟踪,public/ 一堆旧主题残留。结论:部署链路根本不靠这个仓的 git,靠的是 public/ 里那个仓 force push 到 Pages,所以不深入整理,链路完好就行。别在非关键链路上耗时间。

常见问题

Q1: llms.txt 真的能提升 ChatGPT 引用吗?

A: 目前不能。2026 实测 AI 爬虫大多不抓它,直接爬 HTML。它是低成本结构化信号,配上无害,但别当排名因子指望。

Q2: 我不用 Cloudflare,robots.txt 改了就生效吗?

A: 多数直连 / 其他 CDN 改了就生效。但要确认 CDN 没托管同类文件。最稳的验证:curl 线上/robots.txt 看返回体是不是你的版本。

Q3: llms.txt 放重定向行不行?

A: 不行。必须根路径直接 200。PerplexityBot 不跟 /llms.txt 的重定向,重定向等于文件缺失。CDN 子域用服务端 rewrite。

Q4: Hugo 站怎么自动生成 llms-full.txt?

A: 写个模板遍历 Site.RegularPages,按分类聚合输出"标题 + 摘要 + 日期 + 链接"到 public/llms-full.txt,构建时吐出。不手工维护。

Q5: enableGitInfo 开了 lastmod 乱跳怎么办?

A: 别开。旧文不改的话 lastmod = date 本来就对。真改了某篇,单独在那篇 TOML 手写 lastmod

Q6: GEO 改造后多久能看到 AI 引用变化?

A: 没有确定周期。爬虫抓取 + 生成模型都滞后。别盯短期引用率,把它当长期基础设施,配置一次长期受益,别当排名速效药。

相关阅读

© 2026 softon.top

本站已稳定运行 264 天 11 小时 · 123 篇文章

使用 Hugo 构建 主题 Stack 由 Jimmy 设计 由 softon 魔改

最近构建时间:2026-09-22 19:15:47 CST