☰
GEO优化实战:让AI搜索引用你的网站,从robots.txt到结构化数据
2026/10/27 22:52:50 网站建设 项目流程

1. 为什么你的网站在 AI 搜索里“查无此人”

先说一个我最近帮朋友排查的真实案例。他运营了一个做工业传感器选型的技术博客,内容质量不差,Google 自然排名常年在首页前三,但自从他开始用某 AI 搜索工具查自己行业的问题,发现引用的全是竞品网站,自己的站一次都没出现过。他第一反应是“AI 搜索是不是有偏见”,第二反应是“是不是我内容不够好”。我让他把robots.txt发过来一看,问题当场就清楚了——里面有一行Disallow: /,那是他两年前做测试时留下的,一直没删。

这件事说明一个很现实的问题:AI 搜索不引用你的网站,绝大多数时候不是内容问题,而是“AI 根本读不到你的内容”。传统搜索引擎爬虫和 AI 搜索的抓取逻辑有重叠,但 AI 搜索对内容的“可解析性”要求更高。它不只看你能不能被抓到,还看你抓到的内容结构是否清晰、是否容易被切分成语义块、是否有明确的来源标识。

这就是 GEO(Generative Engine Optimization,生成式引擎优化)要解决的核心问题。它和传统 SEO 不是替代关系,而是叠加关系。SEO 解决的是“让人找到你”,GEO 解决的是“让 AI 愿意引用你”。两者的技术底座有交集,但侧重点完全不同。

这篇文章适合三类人看:一是做内容站、技术博客、电商详情页的运营者,发现自己流量被 AI 搜索截流了;二是前端或运维工程师,被老板要求“把网站对 AI 搜索友好一点”但不知道从哪下手;三是做独立开发、出海产品的朋友,想在新一轮搜索形态变化里抢到先机。我会从抓取权限、内容结构、代码实现三个层面,把 GEO 的实操路径拆开讲,所有代码都可以直接复制去用。

2. GEO 和 SEO 到底差在哪:先搞清楚游戏规则

2.1 从“排名竞争”到“引用竞争”的底层逻辑变化

传统 SEO 的终极目标是排名。你优化标题、堆关键词、做外链,本质都是在向搜索引擎的排序算法证明“我这个页面比别人的更值得排在前面”。用户看到的是十条蓝色链接,你的目标就是挤进前三。

GEO 的目标变了。AI 搜索返回的不是链接列表,而是一段综合了多个来源的生成式回答。你的网站可能被引用,也可能被“参考了但没署名”。这里的关键指标从“排名位置”变成了“引用频次”和“引用上下文权重”。换句话说,AI 搜索不关心你排第几,它关心的是:当用户问某个问题时,你的内容能不能被切出来、能不能被信任、能不能被自然地嵌进回答里。

这个变化带来的直接影响是:长尾内容的权重上升了。传统 SEO 里,一篇 3000 字的综合长文可能比十篇 300 字的短问答排名更好。但在 AI 搜索场景下,那些结构清晰、一问一答式的短内容反而更容易被切分和引用。因为 AI 在生成回答时,需要的是“可直接使用的语义单元”,而不是一整篇需要它自己再总结的长文。

2.2 AI 搜索抓取内容的三个硬性门槛

我实测下来,AI 搜索要引用你的网站,至少要过三关。

第一关是抓取权限。这是最基础的。如果你的robots.txt里写了Disallow: /,或者服务器对 AI 爬虫的 User-Agent 返回 403,那后面所有优化都是白费。很多站长在网站上线初期为了防测试爬虫,随手加了一条全站禁止,后来忘了删,结果 AI 搜索上线后直接把自己屏蔽了。

第二关是内容可解析性。AI 爬虫抓到你页面后,需要把 HTML 里的正文提取出来。如果你的内容全靠 JavaScript 动态渲染,而爬虫不执行 JS,那它抓到的就是一个空壳。如果你的正文和导航、广告、侧边栏混在一起没有语义标签,爬虫分不清哪部分是核心内容,引用概率就会大幅下降。

第三关是来源可信度。这一关最微妙。AI 搜索在决定引用谁时,会综合判断域名的权威性、内容的时效性、是否有明确的作者和发布时间、是否被其他可信来源交叉引用。一个没有作者署名、没有更新日期、没有外部引用的页面,即使被抓到了,也很难被优先引用。

2.3 为什么“代码层面”的优化比内容层面更紧急

很多人一提到 GEO,第一反应是“我要多写内容”。但我的经验是,先修代码,再补内容。原因很简单:内容优化是乘法,代码问题是减法。你的内容质量是 10 分,但robots.txt屏蔽了 AI 爬虫,最终得分是 0。你的内容质量是 6 分,但抓取和解析都通畅,最终得分至少是 6。

而且代码层面的修复是一次性的、可验证的。你改完robots.txt,用工具测一下就知道生效没有。你加上结构化数据,用校验工具跑一遍就知道对不对。但内容优化是长期的、模糊的,你很难判断“这篇新文章到底有没有被 AI 引用”。

所以我的建议是:花一个下午把代码层面的问题全部排查一遍,然后再把精力放到内容策略上。下面我就按这个顺序,从抓取权限开始讲。

3. 第一步:让 AI 爬虫进得来——robots.txt 的正确写法

3.1 先搞清楚哪些 AI 爬虫需要放行

robots.txt是网站和爬虫之间的第一道门。传统 SEO 时代,你主要关注 Googlebot、Bingbot 这几个。但 AI 搜索时代,需要放行的爬虫名单变长了。我整理了一份当前主流的 AI 相关爬虫清单,你可以对照检查自己的robots.txt。

爬虫名称所属方用途建议策略
GPTBotOpenAI训练和检索放行
ChatGPT-UserOpenAI实时用户请求放行
Google-ExtendedGoogleAI 训练按需
PerplexityBotPerplexity搜索索引放行
ClaudeBotAnthropic训练和检索放行
Bytespider字节跳动AI 训练按需
CCBotCommon Crawl公共语料按需

这里有个坑要注意:Google-Extended和Googlebot是两回事。Googlebot负责传统搜索索引,Google-Extended控制的是你的内容是否被用于 Google 的 AI 训练和生成式搜索。如果你在robots.txt里禁止了Google-Extended,你的网站在 Google 传统搜索里可能没事,但在 AI 搜索的引用池里就会被排除。

注意:不要为了“保护内容”把所有 AI 爬虫都禁掉。如果你希望自己的网站被 AI 搜索引用,就必须至少放行检索类爬虫(如 GPTBot、PerplexityBot、ChatGPT-User)。训练类爬虫是否放行可以按需决定,但检索类爬虫禁了就等于主动退出 AI 搜索。

3.2 一份可直接抄的 robots.txt 模板

下面这份模板是我在多个内容站上实测有效的,兼顾了传统搜索和 AI 搜索的需求。你可以直接复制,把域名换成自己的。

# 传统搜索引擎 User-agent: Googlebot Allow: / User-agent: Bingbot Allow: / # AI 检索类爬虫(必须放行) User-agent: GPTBot Allow: / User-agent: ChatGPT-User Allow: / User-agent: PerplexityBot Allow: / User-agent: ClaudeBot Allow: / # AI 训练类爬虫(按需选择) User-agent: Google-Extended Allow: / User-agent: Bytespider Allow: / User-agent: CCBot Allow: / # 默认规则 User-agent: * Allow: / Disallow: /admin/ Disallow: /api/ Disallow: /*?sessionid= # 站点地图 Sitemap: https://你的域名.com/sitemap.xml

这份模板的关键点在于:先放行,再限制。很多人的写法是先写User-agent: *然后Disallow: /,再单独给 Googlebot 开白名单。这种写法在 AI 爬虫眼里就是“默认禁止”,即使你后面补了 Allow,不同爬虫的解析优先级也不一样,容易出问题。正确的做法是默认允许,只屏蔽敏感路径。

3.3 验证 robots.txt 是否生效的实操方法

改完robots.txt不是就完事了,必须验证。我一般用三个方法交叉检查。

第一个方法是直接访问https://你的域名.com/robots.txt,确认返回的是你刚改的内容,而不是 CDN 缓存的旧版本。如果用了 Cloudflare 之类的 CDN,记得刷新缓存。

第二个方法是用搜索引擎的 robots.txt 测试工具。Google Search Console 里有内置的测试功能,可以模拟不同 User-Agent 抓取,看是否被允许。虽然它主要针对 Googlebot,但规则逻辑是通用的。

第三个方法最直接:用curl命令模拟 AI 爬虫请求你的首页,看返回状态码。

curl -A "GPTBot/1.0" -I https://你的域名.com/

如果返回200,说明放行成功。如果返回403,说明服务器层面还有拦截,需要检查 Nginx 或 WAF 配置。如果返回301或302,注意跟随跳转后的最终地址是否也可访问。

实操心得:我遇到过一种情况,robots.txt写的是 Allow,但服务器 WAF 里有一条规则把非浏览器 User-Agent 全拦了。这种问题在robots.txt层面看不出来,必须用 curl 实测。所以改完 robots.txt 后,一定要用真实 User-Agent 发一次请求验证。

4. 第二步:让 AI 读得懂——llms.txt 与内容结构化

4.1 llms.txt 是什么,为什么它可能是下一个标配

llms.txt是一个新兴的约定,类似于robots.txt,但它的目的不是控制抓取权限,而是主动告诉 AI 你的网站结构、核心内容在哪里、哪些页面最重要。你可以把它理解成“给 AI 看的站点地图加内容摘要”。

它的提出背景很直接:AI 爬虫抓到一个网站后,面对几十上百个页面,很难快速判断哪些是核心内容、哪些是导航页、哪些是广告页。llms.txt就是一份放在网站根目录的 Markdown 文件,用自然语言告诉 AI:“这是我的核心内容列表,这是我的联系方式,这是我的内容分类。”

目前llms.txt还不是强制标准,但已经有越来越多的 AI 工具开始支持。我的判断是,它会在未来一两年内成为内容站的标配,就像当年的sitemap.xml一样。现在加上,成本极低,收益是提前占位。

4.2 llms.txt 完整写法教程与逐行解析

下面是一份完整的llms.txt示例,我以技术博客为例,你可以根据自己的站点类型调整。

# 某某技术博客 > 专注于工业传感器选型、PLC 编程、边缘计算的技术博客,每周更新 2-3 篇实操教程。 ## 核心内容 - [传感器选型指南](https://example.com/sensors/): 覆盖压力、温度、流量传感器的选型参数与对比 - [PLC 编程实战](https://example.com/plc/): 西门子、三菱、欧姆龙主流型号的编程案例 - [边缘计算部署](https://example.com/edge/): 树莓派、Jetson 等平台的部署教程 ## 关于作者 - [作者简介](https://example.com/about/): 十年工业自动化一线经验 - [联系方式](https://example.com/contact/): 商务合作与技术交流 ## 可选 - [归档页面](https://example.com/archive/): 全部历史文章 - [RSS 订阅](https://example.com/feed/): 更新推送

逐行拆解一下。第一行# 某某技术博客是站点名称,用一级标题。第二行>引用块是站点的一句话简介,这段文字会直接影响 AI 对你网站的第一印象,所以要写得精准,包含核心关键词。## 核心内容下面是重点页面列表,每一条都是[标题](链接): 描述的格式。描述部分要写清楚这个页面解决什么问题,而不是泛泛的“关于我们”。

## 关于作者这一段很多人会忽略,但它对 AI 判断来源可信度很重要。AI 搜索在决定引用谁时,会看内容是否有明确的作者和背景。你把作者信息放在llms.txt里,等于主动提供了信任信号。

## 可选部分放次要页面,AI 可以选择性抓取。这个分层的逻辑是:核心内容优先抓,可选内容按需抓,避免 AI 在大量低价值页面上浪费抓取预算。

4.3 结构化数据:让 AI 一眼看懂你的内容类型

llms.txt是站点级别的指引,结构化数据(Schema.org)是页面级别的标注。两者配合使用,效果最好。

结构化数据的核心作用是告诉 AI:“这个页面是一篇教程”“这个页面是一个产品”“这个页面是一个问答”。AI 拿到这个标注后,就能更准确地决定在什么场景下引用你。

以一篇技术教程为例,我通常会在页面头部加这样一段 JSON-LD:

<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "工业压力传感器选型指南:从量程到输出信号", "description": "覆盖压力传感器选型的五个核心参数,附主流型号对比表", "author": { "@type": "Person", "name": "张三", "jobTitle": "工业自动化工程师" }, "datePublished": "2025-01-15", "dateModified": "2025-03-20", "publisher": { "@type": "Organization", "name": "某某技术博客" } } </script>

这段代码里,@type指定了内容类型是TechArticle,author和datePublished提供了信任信号,dateModified告诉 AI 内容是最新的。我实测下来,加了结构化数据的页面,被 AI 搜索引用的概率明显高于没加的。

注意:结构化数据不是加了就有效,必须和页面实际内容一致。如果你标注的是TechArticle,但页面其实是一个产品购买页,AI 会判定为不一致,反而降低信任度。所以标注类型要如实选择。

5. 第三步:代码层面的实操改造——从 HTML 到响应头

5.1 语义化 HTML:让爬虫不靠猜就能找到正文

很多网站的问题不在robots.txt,而在 HTML 本身。AI 爬虫抓到一个页面,需要从一堆div和span里找出哪部分是正文。如果你的正文没有用语义标签包裹,爬虫就得靠启发式算法猜,猜错的概率不低。

正确的做法是用<article>包裹正文,用<main>包裹主内容区,用<nav>包裹导航,用<aside>包裹侧边栏。这样爬虫一眼就能定位。

<body> <header> <nav>...</nav> </header> <main> <article> <h1>文章标题</h1> <p>正文内容...</p> </article> <aside>侧边栏推荐</aside> </main> <footer>...</footer> </body>

这个改动看起来简单,但效果很直接。我帮朋友改过一个站,只是把正文从<div class="content">换成<article>,两周后 AI 搜索的引用次数从 0 涨到了十几次。原因就是爬虫终于能准确识别正文了。

5.2 服务端渲染与预渲染:解决 JS 空壳问题

如果你的网站是 React、Vue 这类前端框架做的,默认情况下 HTML 里只有一个空<div id="app">,正文全靠 JS 渲染。AI 爬虫大多数不执行 JS,抓到的就是空壳。

解决方案有三个层次。最彻底的是服务端渲染(SSR),用 Next.js、Nuxt 这类框架,让服务器直接返回带内容的 HTML。成本最低的是预渲染,用prerender-spa-plugin或puppeteer在构建时把页面渲染成静态 HTML。折中方案是动态渲染,检测到爬虫 User-Agent 时返回预渲染版本。

我一般推荐预渲染,因为改造成本低,不需要重构整个应用。以 Vue 项目为例,加一个prerender-spa-plugin配置:

// vue.config.js const PrerenderSPAPlugin = require('prerender-spa-plugin') const path = require('path') module.exports = { configureWebpack: { plugins: [ new PrerenderSPAPlugin({ staticDir: path.join(__dirname, 'dist'), routes: ['/', '/about', '/blog', '/blog/post-1'], renderer: new PrerenderSPAPlugin.PuppeteerRenderer({ renderAfterDocumentEvent: 'render-event' }) }) ] } }

这段配置会在构建时把指定路由渲染成静态 HTML,爬虫抓到的就是完整内容。routes数组里列出你希望被 AI 抓取的核心页面。

5.3 响应头与缓存策略:别让 CDN 挡住 AI 爬虫

这一条是最容易被忽略的。很多网站用了 CDN,CDN 的缓存策略和 WAF 规则可能会拦截 AI 爬虫。我遇到过好几次,robots.txt没问题,HTML 也没问题,但 AI 爬虫就是抓不到,最后发现是 CDN 的 Bot 管理功能把非浏览器请求全拦了。

排查方法是直接看响应头。用 curl 请求你的页面,检查Server、CF-Ray、X-Cache这些头信息。

curl -A "GPTBot/1.0" -I https://你的域名.com/blog/post-1

如果看到cf-mitigated: challenge或者X-Cache: Error from cloudfront,说明 CDN 层面有拦截。你需要去 CDN 控制台把 AI 爬虫的 User-Agent 加入白名单,或者关闭针对这些 User-Agent 的 Bot 挑战。

另外,缓存策略也要注意。如果你的页面设置了Cache-Control: no-store,AI 爬虫每次来都要回源,抓取效率低,可能影响抓取频次。建议对内容页设置合理的缓存时间,比如Cache-Control: public, max-age=3600。

6. 常见问题与排查技巧实录

6.1 AI 搜索不引用我的网站,怎么一步步排查

我整理了一个排查清单,按顺序走一遍,基本能定位到问题。

排查项检查方法常见问题
robots.txt访问 /robots.txt,用 curl 模拟爬虫全站 Disallow,或屏蔽了 AI 爬虫
服务器响应curl -A "GPTBot" -I 你的域名返回 403 或 503
CDN/WAF检查响应头是否有 challengeBot 管理拦截了非浏览器请求
HTML 结构查看源代码是否有正文JS 空壳,爬虫抓不到内容
结构化数据用 Schema 校验工具标注类型与实际内容不符
llms.txt访问 /llms.txt文件不存在或格式错误
内容时效检查 dateModified内容过时,AI 优先引用新内容

这个清单我用了很多次,基本上前三项就能解决 80% 的问题。剩下 20% 往往是内容层面的,比如你的内容虽然被抓到了,但 AI 判断有更权威的来源,所以没引用你。

6.2 几个我踩过的坑和对应的解法

第一个坑是robots.txt的优先级问题。不同爬虫对Allow和Disallow的解析顺序不一样。有的爬虫先匹配Disallow,有的先匹配Allow。我建议的写法是:默认Allow: /,然后只Disallow具体路径,不要用通配符大面积禁止。

第二个坑是llms.txt的编码问题。这个文件必须是 UTF-8 编码,如果用了 GBK,中文会乱码,AI 读到的就是一堆问号。保存的时候注意一下编码格式。

第三个坑是结构化数据的嵌套错误。JSON-LD 里如果author写成了字符串而不是对象,校验工具会报错,AI 也可能忽略。正确的写法是"author": {"@type": "Person", "name": "张三"},而不是"author": "张三"。

第四个坑是 CDN 缓存了旧的robots.txt。你改完文件,访问发现还是旧内容,这时候需要去 CDN 控制台手动刷新缓存,或者等缓存过期。我一般会在改完后加一个版本号参数测试,比如robots.txt?v=2,确认新内容生效后再等 CDN 自然刷新。

6.3 如何验证 AI 搜索是否真的引用了你

这个问题没有官方工具,但有几个间接方法。一是直接在 AI 搜索里搜你的品牌名或核心关键词,看回答里有没有提到你。二是看服务器日志,筛选 AI 爬虫的 User-Agent,看抓取频次和抓取页面。三是用第三方工具监控 AI 搜索的引用情况,目前有一些新兴工具在做这个,但准确度参差不齐。

我自己的做法是看日志加人工抽查。日志里如果 GPTBot 和 PerplexityBot 的抓取频次稳定上升,说明抓取层面没问题。然后每周手动搜几个核心问题,看引用来源里有没有自己。这个方法笨,但可靠。

7. 内容策略的配合:代码修好之后该做什么

代码层面修完,只是让 AI“能读到”你。接下来要解决的是“愿意引用”你。这两件事是乘法关系,缺一不可。

从我的实操经验看,AI 搜索偏好的内容有三个特征。第一是问题导向,标题和开头直接点明解决什么问题,而不是泛泛的介绍。第二是结构清晰,用小标题、列表、表格把内容切分成可独立引用的语义块。第三是有明确的来源和时效,作者署名、发布时间、更新记录都要有。

具体到写作上,我建议每篇文章围绕一个具体问题展开,标题用“如何……”“……的五个参数”“……排查指南”这种形式。正文里多用二级标题切分,每个小节控制在 300 到 500 字,这样 AI 在切分引用时更容易找到完整的语义单元。

另外,llms.txt里的核心内容列表要定期更新。你新发了一篇高质量教程,就把它加进去。AI 爬虫下次来的时候,就能第一时间发现你的新内容。这个动作花不了几分钟,但效果比等爬虫自己发现要快得多。

最后分享一个我最近在用的技巧:在文章末尾加一段“常见问题”小节,用问答形式写三到五个相关问题。这种结构特别容易被 AI 搜索直接抓取引用,因为问答对本身就是 AI 生成回答时最需要的素材形态。我试过几篇加了问答小节的教程,被引用的频率明显高于没加的。

代码层面的 GEO 优化,说到底就是一件事:降低 AI 理解你网站的成本。你把robots.txt写清楚,把llms.txt放上去,把 HTML 语义化,把结构化数据标好,AI 就能用最低的成本读懂你、信任你、引用你。这些动作都不复杂,但需要有人认真做一遍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询