从拦截 AI 爬虫到成为大模型答案源 - 独立博客 SEO 与 GEO 01

前言

在维护个人技术博客的过程中,很多开发者(包括我自己在内)都经历过一个心理演进阶段:

  1. 早期阶段:只关注内容产出,偶尔交个 sitemap.xml 给 Google 和百度,任其自然生长;
  2. 2023~2024 年的大模型爆发期:看到新闻里对各种 AI 爬虫的口诛笔伐,担心辛辛苦苦写的原创排坑文章被 AI “无偿白嫖做训练语料”,于是在 robots.txt 里把 GPTBotCCBotClaudeBot 一股脑全部 Disallow: / 锁死;
  3. 2025~2026 年的生成式搜索期:越来越多的开发者在遇到技术疑难杂症时,第一反应不再是去传统搜索引擎逐条翻翻看,而是直接把终端报错粘贴给 Perplexity、ChatGPT Search、Claude 或者 DeepSeek

此时一个尖锐的问题摆在面前:当用户都在向 AI 要答案时,如果你的博客被 AI “失明”式地屏蔽在知识库门外,你的技术文章写给谁看?

今天,我把本博客近期围绕 SEO(搜索引擎优化)与 GEO(Generative Engine Optimization,生成式引擎优化) 进行的完整底层改造梳理出来,分享一套可直接落地的实践指南。


1. 概念厘清:传统 SEO 与现代 GEO 的本质分水岭

在动手改代码之前,必须先建立清晰的认知框架。SEO 和 GEO 并不是非此即彼的对立关系,而是演进与叠加

评估维度传统 SEO (Google / Bing / 百度)现代 GEO (Perplexity / ChatGPT / Claude)
工作目标在 10 个蓝色链接(SERP)中争夺前 3 名的点击率在生成式 AI 的总结性答案中成为被标号的权威来源(Citation)
检索机制关键词倒排索引(Inverted Index)+ PageRank 外链权重语义向量嵌入(Vector Embeddings)+ RAG 分块检索 + 重排模型(Reranker)
内容偏好密度合理的关键词排布、长篇综合覆盖、字数权重信息增益(Information Gain)、高密度的直接结论、结构化表格与可复现代码
权威判定域名历史、反向链接(Backlinks)、外链锚文本E-E-A-T 知识图谱实体(作者真实身份、同名平台互信声明、技术溯源可信度)

核心结论:做好 SEO 是基础(保证爬虫能抓、渲染快、体验好),做好 GEO 则是未来的增长引擎(保证 AI 检索得到、理解得懂、信任得过、愿意引用)。


2. 破局第一步:彻底重构 robots.txt,拥抱 AI 语料生态

审查我原本的 robots.txt 时,发现了一个严重的认知误区——它依然保留着 2023 年的防备心态:

1
2
3
4
5
6
7
8
9
# 阻断式配置示例:会导致搜索引擎与模型检索完全无法抓取内容
User-agent: GPTBot
Disallow: /
User-agent: ClaudeBot
Disallow: /
User-agent: CCBot
Disallow: /
User-agent: Bytespider
Disallow: /

为什么必须立即废除上述规则?

  1. CCBot (Common Crawl) 是全球开源模型的基石
    DeepSeek、Llama、Qwen、Mistral 等全球顶尖开源基础大模型,其海量训练数据集的基础均来源于 Common Crawl 的快照。封禁 CCBot,等于主动剥夺了你的原创内容进入未来基础模型“参数记忆”的权利
  2. ClaudeBot 承担着实时搜索重任
    Anthropic 官方规范明确指明,Claude 的联网搜索与实时溯源依托 ClaudeBot。封禁它直接导致使用 Claude 联网模式的程序员永远检索不到你的排坑方案。
  3. Perplexity 成为引流王牌
    Perplexity 每天给各类技术博客与文档输送着海量的精准开发者流量,且转化率和停留时间远超传统搜索。如果你的 robots.txt 遗漏了对它的欢迎,无疑是自断臂膀。
  4. 移除对 /js//css/ 的错误屏蔽
    我早期为了节省抓取带宽,曾误认为应该阻断静态资源。但实际上 Googlebot 和 Bingbot 采用无头浏览器真机渲染,必须加载 CSS 和 JS 来判定移动端友好性与防隐蔽作弊,屏蔽它们会直接在 Google Search Console 中被标记为“资源受阻”并遭受降权。

2.2 现代化、规范的静态博客 robots.txt 落地模版

针对 Hexo 等纯静态技术博客,我们推行一套精简且高权重的标准配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# =================================================
# 1. 核心搜索引擎与 AI 检索/答案引擎 (Search & GEO Crawlers)
# 完全放行:让主流搜索引擎与 AI 模型索引、学习并直接引用你的原创内容
# =================================================
User-agent: Googlebot
User-agent: Google-Extended
User-agent: Bingbot
User-agent: Baiduspider
User-agent: OAI-SearchBot
User-agent: ChatGPT-User
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: PerplexityBot
User-agent: Applebot
User-agent: Applebot-Extended
User-agent: Meta-ExternalAgent
User-agent: CCBot
User-agent: Bytespider
Allow: /

# --- 屏蔽纯内部数据文件 (避免乱码抓取与非内容索引) ---
Disallow: /search.xml
Disallow: /search.json
Disallow: /content.json
Disallow: /public/

# =================================================
# 2. 广告与分析工具支持
# =================================================
User-agent: Mediapartners-Google
Allow: /

# =================================================
# 3. 通用兜底规则 (Fallback)
# =================================================
User-agent: *
Allow: /
Disallow: /search.xml
Disallow: /search.json
Disallow: /content.json
Disallow: /public/

# =================================================
# 4. 站点地图与说明书 (Sitemaps & GEO)
# =================================================
Sitemap: https://your-domain.com/sitemap.xml
Sitemap: https://your-domain.com/baidusitemap.xml

2.3 核心避坑:关于 WordPress 渲染、HTTP 410 与 noindex, follow 的修正思考

本文初版发布后,友人 @tjsky 及时指出了我原先配置中的几处不当之处(文末附致谢)。因为本站早期确实是使用 WordPress 部署的,后来整体迁移到了 Hexo,我在处理旧路径和权重收敛时理解不够准确。在此把这几个关键的技术原理重新梳理清楚:

避坑一:WordPress 站点的渲染基础(避免屏蔽 /wp-includes//wp-content/

在编写 WordPress 站点的 robots.txt 时,直接把核心目录一律阻断是完全错误的:

  1. /wp-includes/ 存放着 jQuery、前端区块编辑器(Gutenberg)样式及基础矢量资源;
  2. /wp-content/ 存放着当前激活主题的核心 CSS/JS 以及最重要的媒体上传目录(/wp-content/uploads/);
  3. 正如前文所述,现代 Googlebot 和 Bingbot 依托无头 Chromium 渲染引擎。若屏蔽上述目录,爬虫抓取到的页面将彻底失去 CSS/JS,直接退化为排版崩塌的裸文本甚至空白页面,并在移动端适配测试中严重挂科;
  4. 更严重的是,站内原创图片几乎全量位于 /wp-content/uploads/ 下,一条 Disallow: /wp-content/ 会直接导致站内图片在 Google 图片搜索中全部消失。

如果站点使用的是 WordPress,官方标准极其简练,切勿画蛇添足:

1
2
3
User-agent: *
Disallow: /wp-admin/
Allow: /wp-admin/admin-ajax.php

避坑二:旧 CMS 迁移路径的处置误区(HTTP 410 墓碑机制 vs robots.txt 掩耳盗铃)

本站早期确实是使用 WordPress 部署的,后来整体迁移到了 Hexo。在迁移完成后,我原先简单地在 robots.txt 中配置了 Disallow: /wp-*,试图以此阻止爬虫继续抓取旧路径。但实际上这种做法并不符合规范,甚至会带来负面效果。

为什么用 robots.txt 阻断废弃 CMS 路径是不对的?

  • robots.txt 的作用是“禁止抓取(Disallow Crawling)”,而不是“禁止索引(No Indexing)”;
  • 当一个旧 URL 曾经被收录或存在外部反向链接时,如果爬虫在 robots.txt 中被禁止访问该路径,它就无法发起 HTTP 请求去探测该路径是否还存在
  • 结果就是搜索引擎依然会把这个旧路径保留在索引数据库中,但在搜索结果中展示为极其刺眼的提示:“由于该网站的 robots.txt 限制,未提供此网页的信息”,反而持续影响站点展示效果。

架构级正解:Web 服务器端返回 HTTP 410 (Gone)
根据 RFC 9110 规范,410 代表资源已永久消失且永不恢复。在 Nginx 网关层直接配置:

1
2
3
4
# Nginx 响应 HTTP 410 墓碑代码,明确告知搜索引擎彻底移除废弃路径
location ~* ^/(wp-admin|wp-content|wp-includes|xmlrpc\.php|trackback) {
return 410;
}

当爬虫探测到 HTTP 410 时,会以最高优先级将其从全网索引数据库中彻底抹除,干净利落地终结历史废弃链接。

避坑三:“集中权重给高价值正文页”的正确打法(为什么是 noindex, follow 而非 robots.txt 截断?)

在本文初版中,我曾试图通过在 robots.txt 中配置如下规则来集中权重给正文页:
Disallow: /archives/
Disallow: /categories/

这一做法的初衷是想聚焦正文,但在做法上并不合适:

  • 归档页、分类页和标签页,是爬虫自顶向下遍历整个博客网站的核心枢纽与拓扑干道
  • 如果在 robots.txt 中直接封死,爬虫连页面 HTML 都无法拉取,页面里包含的指向底层长尾博文的 <a href="..."> 链接就彻底被蒙在鼓里,导致深层文章失去内链抓取入口。

正确的通用做法

  1. robots.txt放行归档、分类与分页列表;
  2. 在这些聚合页面的 <head> 中注入标准化元标记:
    1
    <meta name="robots" content="noindex, follow">
    • noindex:明确告诉搜索引擎不要把当前的分类或归档列表收录到搜索结果中,避免低信息密度的重复聚合页挤占技术正文的搜索展示份额;
    • follow:要求爬虫顺着当前页面的所有文章链接继续下潜抓取,将页面累积的内链权重平滑输送至每篇技术正文。

在 Hexo 中,我们可以在静态构建管道(如 scripts/a11y-enhancements.js)中自动化装配这一规则:

1
2
3
4
5
6
7
8
9
10
11
12
// 在 after_render:html 构建过滤器中自动识别聚合与分页路由
const pagePath = pageData.path || '';
if (pagePath === '404.html') {
additionalMeta += '<meta name="robots" content="noindex, nofollow">\n';
} else if (
pagePath.startsWith('page/') ||
pagePath.startsWith('archives/') ||
pagePath.startsWith('categories/') ||
pagePath.startsWith('tags/')
) {
additionalMeta += '<meta name="robots" content="noindex, follow">\n';
}

这样既实现了权重的高度纯化与聚焦,又完整保全了爬虫深入发现全站知识库的超链接穿透能力。


3. 实体权威化:注入高权重 Schema.org JSON-LD 知识图谱

为什么 HTML Microdata 已经落后?

很多 Hexo 主题仅在 HTML 标签上附带微数据(例如 <article itemscope itemtype="http://schema.org/Article">)。这种分散在 DOM 节点各处的属性存在两个明显缺陷:

  • 解析成本高:爬虫或大模型解析器必须把整颗 DOM 树完整遍历一遍才能拼凑出文章属性;
  • 缺乏多源实体对齐:无法优雅地将作者与 GitHub、掘金、CSDN 等外部平台绑定。

根据 Google 开发者规范及各 AI Search 的推荐,<script type="application/ld+json"> 是结构化数据最理想的黄金载体

自动化构建管线注入

在 Hexo 中,我们无需魔改复杂的主题源码,只需在 scripts/ 扩展目录中注册一个 after_render:html 管道,即可在构建期自动为每篇博文与首页装配标准 JSON-LD:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// scripts/a11y-enhancements.js (或 site-enhancements.js) 核心片段
hexo.extend.filter.register('after_render:html', function(str) {
if (!str) return str;

const nextConfigMatch = str.match(/<script class="next-config" data-name="page" type="application\/json">([\s\S]*?)<\/script>/);
if (nextConfigMatch) {
try {
const pageData = JSON.parse(nextConfigMatch[1]);
let schema = null;

// 1. 社交卡片 og:image 兜底
if (!str.includes('property="og:image"')) {
str = str.replace('</head>', '<meta property="og:image" content="https://your-domain.com/images/default-cover.png">\n</head>');
}

// 2. 技术文章详情页:TechArticle + Person 实体声明
if (pageData.isPost) {
const pubMatch = str.match(/<meta property="article:published_time" content="([^"]+)">/);
const modMatch = str.match(/<meta property="article:modified_time" content="([^"]+)">/);
const descMatch = str.match(/<meta property="og:description" content="([^"]+)">/) || str.match(/<meta name="description" content="([^"]+)">/);

schema = {
"@context": "https://schema.org",
"@type": "TechArticle",
"headline": pageData.title.replace(/\s*\|\s*站点名称\s*$/, '').trim(),
"url": pageData.permalink,
"datePublished": pubMatch ? pubMatch[1] : undefined,
"dateModified": modMatch ? modMatch[1] : undefined,
"description": descMatch ? descMatch[1] : undefined,
"inLanguage": "zh-CN",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": pageData.permalink
},
"author": {
"@type": "Person",
"name": "YourName",
"url": "https://your-domain.com/about/",
"sameAs": [
"https://github.com/your-username",
"https://blog.csdn.net/your_csdn_id",
"https://juejin.cn/user/your_juejin_id"
]
},
"publisher": {
"@type": "Organization",
"name": "站点名称",
"logo": {
"@type": "ImageObject",
"url": "https://your-domain.com/images/logo.png"
}
}
};
} else if (pageData.isHome) {
// 3. 站点首页:WebSite 实体声明
schema = {
"@context": "https://schema.org",
"@type": "WebSite",
"name": "站点名称 | 全栈技术笔记",
"url": "https://your-domain.com/",
"description": "探索技术边界,记录从大模型微调、RAG系统搭建到高性能编程的实战经验。",
"author": {
"@type": "Person",
"name": "YourName",
"sameAs": ["https://github.com/your-username"]
}
};
}

if (schema) {
const tag = `<script type="application/ld+json">${JSON.stringify(schema)}</script>\n`;
str = str.replace('</head>', `${tag}</head>`);
}
} catch (e) {
// 容错保障
}
}

return str;
}, 20);

sameAs 的玄机:实体消歧(Entity Disambiguation)

通过在 JSON-LD 中配置 sameAs: [GitHub, CSDN, 掘金],当搜索引擎和大模型扫描全网时,能直接把你在 GitHub 的开源代码仓库、CSDN 的技术积分与独立博客聚合在一起,在后台知识库中被打上明确的“Verified Tech Creator(已验证技术专家)”标签,这对 E-E-A-T(专业度、经验、权威度、可信度)的提升是决定性的。


4. 内容架构革新:打造天生契合 RAG 检索分块的优质文章

基础配置完成后,决定能否被大模型有效检索和引用的关键依然在于内容本身的组织结构

当代大模型在进行 RAG 搜索时,通常将页面切为 500 ~ 800 Tokens 的语义块(Chunks)。杂乱冗长的段落较难被向量模型提炼出高分。实践中可以发现,以下三类排版形式更便于大模型进行切块与语义匹配:

① 顶部强约束的 TL;DR 摘要

在文章首屏直接给出无废话的核心要点列表:

1
2
3
4
> **核心摘要 (TL;DR)**
> - 核心原因:企业安全软件每 600 秒强制阻断长连接
> - 核心解决方案:开启 WSL2 Mirrored 镜像网络,并配置 TCP Keep-Alive
> - 影响版本:Windows 11 23H2 + WSL 2.1.5+

AI 在抓取首段时,会将此内容直接提炼为问答框顶部的总结句,并附带引用角标。

② 精准参数与多维对比表格

大模型对 Markdown Table(原生表格)的理解深度天然高于非结构化段落:

1
2
3
4
5
| 配置项 | 推荐值 | 作用与机制 |
| :--- | :--- | :--- |
| `tcp_keepalive_time` | 120 | 探测包发送周期,规避 600 秒断流 |
| `tcp_keepalive_probes` | 3 | 失败重试次数 |
| `networkingMode` | `mirrored` | 共享宿主网络协议栈 |

③ 最小可复现排错闭环(Error -> Cause -> Quick Fix)

将长尾故障日志、根因分析与代码块清晰组合:

  • 精确报错词(Error Signature):完整保留终端错误输出,这是用户 Prompt 的最高频关键词;
  • 一键可复制修复代码(Quick Fix):提供可以直接 curlpip install 或一键替换的完整命令,大模型在合成答案时会直接推举你的方案为标准答案。

5. 效果验证与自查清单

改造完成后,可以通过以下标准检验你的站点:

  1. 富媒体与结构化测试
  2. AI 爬虫联通性自查
    • 使用终端或浏览器检查 https://你的域名/robots.txt,确认 CCBotClaudeBotGPTBotPerplexityBot 已处于 Allow: / 列表;
  3. 真实 AI 问答测试
    • 打开 Perplexity.aiChatGPT Search,输入你文章中独特的排坑标题或长尾关键词;
    • 观察引用源栏目,你的域名与文章是否出现在右侧参考资料(Sources)中。

结语

技术自媒体的竞争,正在从“谁能在百度或 Google 排到第一页”,悄然演变成“谁的独到见解与实战方案能被大模型在数秒内采纳并输出给全球工程师”。

拥抱 GEO,并不是去讨好机器,而是用更严谨、更规范的语义结构,把我们踩坑总结出来的真实工程智慧,更高效地传递给需要帮助的人。如果你的个人博客也遇到了自然流量瓶颈,不妨也从这篇指南开始,重构你的 robots.txt 与知识图谱体系吧!


致谢 (Acknowledgements)

本文初版发布后,友人 tjsky (GitHub: @tjsky) 及时指出了我原先配置中的几处硬伤。由于本站早期确实是基于 WordPress 部署,后续搬迁到了 Hexo,我在处理旧路径和权重收敛时理解不够准确,给出了不符合现代规范的做法。非常感谢 tjsky 友人的专业指正,帮我理清了原理并完成了全站调整。

由 tjsky 友人指正的具体内容包括:

  1. WordPress 核心资源渲染问题
    指正了我原配置中屏蔽 /wp-includes//wp-content/ 的错误。由于现代 Googlebot 和 Bingbot 采用无头浏览器渲染,屏蔽核心静态资源会导致页面丢失样式甚至白屏、移动端判定失败;且 WordPress 的图片资源都在 /wp-content/uploads/ 下,屏蔽后会导致图片在搜索中全部丢失。
  2. 废弃旧路径的处理方式(HTTP 410 vs robots.txt)
    指正了“在 robots.txt 中 Disallow 废弃旧路径”的做法。robots.txt 仅限制抓取而不限制索引,旧路径仍会被搜索引擎收录并显示为受限制的死链;正确的做法是在 Web 服务器端(如 Nginx)直接返回 HTTP 410 (Gone),让搜索引擎主动清理。
  3. 分类与归档页的权重分配(noindex, follow vs robots.txt 拦截)
    指正了我此前在 robots.txt 中屏蔽 /archives//categories/ 的做法。直接屏蔽会截断爬虫遍历整站文章的路径;正确的做法是放行抓取,并在页面头部配置 <meta name="robots" content="noindex, follow">,既能集中权重,又不会阻断爬虫顺着链接发现其他文章。

再次感谢 @tjsky 友人的专业指正!