AMP 版本退役不干净,AI 搜索只抓到精简页:rel=amphtml 残留的排查与清理复盘
适用读者:官网还留着历史 AMP 页面的后端与站长;在做生成式引擎优化(Generative Engine Optimization, GEO)但发现 AI 回答里自家产品参数缺斤短两的技术同学;负责 CMS 模板下线、担心旧标签残留的负责人。
九月初,销售转来一张某 AI 搜索引擎的回答截图,问为什么竞品的多工位热压机把吨位、台面尺寸、开口行程列得整整齐齐,咱们家的只写了个型号就没了下文。我第一反应是 JSON-LD 结构化数据被写错了,打开正式页面一看,数据好好的。折腾两天才发现,锅在一个两年前就该删掉的标签上——<link rel="amphtml">。这事儿不查日志真看不出来,把过程记下来,同行大概率用得上。
AI 回答少参数,先别急着改 JSON-LD
我们站是做工业设备的 B2B 官网,产品页从 2019 年起挂着 AMP 版本,为了进 Google 新闻卡片。2021 年 Google 官方宣布 AMP 不再是 Top Stories 的硬性要求,2023 年我们做改版时把 AMP 功能从 CMS 里下线了,当时觉得功能开关关了就完事。

前端小蒋复核了产品页的 schema.org Product 标记,字段齐全;用浏览器渲染模式抓正文,参数一个不少。也就是说,问题不在我们以为的「内容层」,而在「AI 到底读了哪一层」。做 GEO 做了一段时间的都知道,AI 引擎引用什么,取决于它的爬虫抓到了什么,而不是你页面上有什么。
对比日志,发现爬虫一直在抓 AMP 精简页
运维老周拉了三十天的访问日志,把主流 AI 爬虫的 UA 单独过滤出来,事情立刻清楚了。GPTBot 和 PerplexityBot 抓取我们站的请求里,落点在 /amp/ 路径的分别占了四成和三成多。这些 AMP 页面是旧模板渲染的,模板里只有标题、首图和一段两百字的简介,参数表、FAQ、JSON-LD 全部被裁掉了。
爬虫不是不抓正式页,而是两条路都在走,精简页因为 DOM 小、返回快,被抓的频次反而更高。AI 引擎拿到两个版本,摘要生成时经常拼的是精简页那点可怜的内容,参数自然就缺了。老周看完日志就一句话:「原来这两年 AI 一直在读我们的旧残页。」
逐层排查 rel=amphtml 残留
顺着日志往回查,残留不在一处,是三层叠在一起。排查路径如下图:
flowchart TD
A[发现 AI 回答缺设备参数] --> B[复核正式页 JSON-LD 无问题]
B --> C[过滤三十天日志按 UA 分析]
C --> D[发现大量请求落在 amp 路径]
D --> E[查模板层 rel=amphtml 是否输出]
E --> F[查路由层 amp 路由是否还开着]
F --> G[查 CDN 层缓存里是否有 AMP 副本]
G --> H[三层全部清理并配置 301]
三层残留的具体情况和处理方式:
| 残留层 | 现象 | 根因 | 处理 |
|---|---|---|---|
| 模板层 | 正式页 head 里仍输出 <link rel="amphtml" href=".../amp/"> |
Razor 布局里这段标签是独立 partial,下线 AMP 时漏删 | 直接移除输出逻辑 |
| 路由层 | /amp/xxx 地址仍返回 200 和完整 AMP 页 |
CMS 的 AMP 功能开关关了,但旧路由注册还在 | 旧地址全部 301 到正式页 |
| CDN 层 | 源站改完,线上仍有 AMP 副本被命中 | 边缘节点缓存 TTL 设了七天,旧副本一直没过期 | 全量刷新缓存并改回源规则 |
CDN 这层最容易漏。我们源站周三就删干净了,线上周五还在吐 AMP 页,就是缓存续的命。后来定了规矩:动 URL 结构的改动,必须同步提交缓存刷新工单,不然等于白改。
双版本抓取的机制:爬虫为什么优先拿精简页
这一节讲底层机制,搞明白以后这类问题不用再猜。rel=amphtml 是 HTML 规范里定义的一种链接关系(link type),写法是 <link rel="amphtml" href="AMP 版地址">,作用是向爬虫声明:本页存在一个 AMP 精简版本。它和 rel=canonical 是一对反向指针——canonical 说「我是副本,正主在那边」,amphtml 说「我是正主,精简版在那边」。
Googlebot 对这个标签的处理是成体系的:发现 amphtml 就会去抓 AMP 版,并且在很长一段时间里优先把 AMP 版作为索引和展示的来源。AI 搜索爬虫虽然没有 Google 那套 AMP 渲染体系,但它们普遍实现了 link relation 的通用跟随逻辑,看到 amphtml 就当成「官方推荐的另一版本」去抓。从爬虫的调度角度看这是合理的:AMP 页 DOM 小、资源少,抓取成本不到正式页的三分之一,同样的预算能多抓很多页。
问题出在内容面上。AMP 模板为了加载速度,正文、参数表、结构化数据往往只保留了子集,我们旧模板就只剩两百字简介。AI 爬虫两个版本都抓,但精简页因为轻、快、返回稳定,抓取频次更高;生成引擎做引用时又不区分版本来源,于是「抓得多的」压过了「内容全的」。整个链路如下图:
flowchart LR
A[AI 爬虫抓正式页] --> C[发现 head 里的 amphtml 标签]
C --> D[跟随标签去抓 AMP 精简页]
D --> E[精简页无参数表和 JSON-LD]
E --> F[引用与摘要基于精简内容生成]
F --> G[AI 回答缺吨位行程等参数]
一句话讲透:只要 amphtml 标签还活着,就算 AMP 服务早就退役,爬虫的抓取链路仍然认它。 链接关系是声明,不是功能开关,CMS 关掉功能不会让标签自己消失。
清理与 301 策略
清理分两步:源头不产出,历史地址有交代。第一段是 ASP.NET Core 8 里的路由处理,把旧 AMP 地址整体 301 到正式页。
依赖与环境:ASP.NET Core 8(Microsoft.NET.Sdk.Web),部署在 Linux,Nginx 1.24 反代。
// 位置:Program.cs,中间件管道最前端
app.Use(async (ctx, next) =>
{
var path = ctx.Request.Path;
// 只拦 /amp 前缀,其余业务路径原样放行
if (path.StartsWithSegments("/amp"))
{
// 去掉 /amp 前缀,参数页的 query 原样保留
var target = path.Value!.Replace("/amp", "");
ctx.Response.StatusCode = StatusCodes.Status301MovedPermanently;
ctx.Response.Headers.Location =
string.IsNullOrEmpty(target) ? "/" : target;
return;
// 301 已写入响应,终止管道不再进后续中间件
}
await next();
// 非 AMP 路径全部按原逻辑处理
});
第二段是 Nginx 层的兜底,防止上游万一漏删,响应头里的 AMP 线索也被掐掉。
依赖与环境:Nginx 1.24,proxy_hide_header 为内置模块,无需额外安装。
server {
listen 443 ssl;
server_name example.com;
# 证书与域名按站点实际情况替换
# 兜底:历史 AMP 地址全部 301 到正式页
location ~* ^/amp/(.*)$ {
# 永久重定向,缓存层也会跟着更新指向
return 301 /$1;
}
# 掐掉上游响应头里的 Link 字段,防止 amphtml 残留外泄
# 即使源站模板漏删,边缘节点也不会再向爬虫透出线索
proxy_hide_header Link;
location / {
# 正常业务路径回源,交由后端处理
proxy_pass http://backend;
}
}
301 而不是 404 或 410,是刻意的。这些 AMP 地址在搜索引擎和外部链接里攒了几年引用,404 会把这部分历史信号直接丢掉;301 把它平移到正式页,对 GEO 来说等于把分散在两个版本的抓取记录合并成一份。改完之后全量刷新 CDN 缓存,再用日志观察两周确认 /amp/ 请求归零。
改造前后的 AI 引用对照
十月初用同一组提问在三个 AI 搜索引擎复测,差异很直观:
| 对比项 | 改造前(9 月) | 改造后(10 月) |
|---|---|---|
| 爬虫抓取落点 | 四成左右落在 /amp/ 精简页 | 全部落在正式页 |
| AI 回答中的设备参数 | 只出现型号,缺吨位、行程、台面尺寸 | 型号加全部核心参数齐全 |
| 回答引用的正文字数 | 约两百字,来自 AMP 简介段 | 引用自完整正文段落 |
| JSON-LD 被读取 | 经常读不到,只能靠正文摘要 | 稳定读取 Product 与 FAQ 标记 |
| 咨询表单转化线索 | 与 AI 渠道无关,基本为零 | 月内出现三条明确来自 AI 回答的询盘 |
参数出现率从三个引擎里只有一个提到吨位,变成三个全部提到。询盘那三条线索说服力比任何报表都强——销售拿到的备注栏里直接写着「AI 搜索回答里看到的参数」。
踩完这轮,留下三条经验
一个常见误区要先说清:很多人以为 Google 宣布 AMP 不是硬性要求,就等于爬虫不再认 AMP。实际上 2021 年的公告只是取消了展示层的强制,抓取行为由页面自身的链接关系决定,标签在,链路就在。AMP 的退役必须是「标签、路由、缓存」三处同时拆干净,只拆功能开关等于没拆。
第二,AI 搜索时代,响应头和 head 里的每个链接关系都值得重新审一遍。rel=amphtml、rel=alternate、rel=prev/next 这些老标签,都是 AI 爬虫的导航信号,信号指错方向,内容写得再全也是白费劲。
第三,排查这类问题的抓手不是直觉,是日志。把 AI 爬虫的 UA 从几十 GB 访问日志里过滤出来看落点分布,两小时就能定位的事,靠猜要猜一个季度。后来我们把「AI 爬虫落点周报」加进了例行监控,省事不少。
如果你也在做 GEO,建议今天就 grep 一下自己站点的 head 输出,看看 amphtml 是否还活着。有类似经历欢迎评论区交流,尤其是 CDN 缓存续命这种坑,各家的情况值得互相参考。
参考与延伸
- Google Search Central 官方博客(2021 年关于 AMP 不再是 Top Stories 硬性要求的公告可在此检索):https://developers.google.com/search/blog
- AMP HTML 规范中关于 rel=amphtml 链接关系的定义:https://amp.dev/documentation/guides-and-tutorials/learn/spec/amphtml/
- MDN rel 属性文档(含 canonical 等链接关系说明):https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel
- schema.org 官方文档(Product、FAQPage 等结构化数据类型):https://schema.org/
rel=amphtml、AMP 精简页、AI 搜索、GEO、结构化数据、爬虫抓取、301 重定向、ASP.NET Core