AMP 版本退役不干净,AI 搜索只抓到精简页:rel=amphtml 残留的排查与清理复盘

2026-10-02 01:18:50 0 次浏览
GEOAI搜索AMP结构化数据.NET 8爬虫

适用读者:官网还留着历史 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

🤖
本内容由 AI 辅助生成,经人工校对审核;部分素材、资料来源于公开网络,仅作个人观点分享与交流使用,无任何商业侵权意图。若内容、图片、文字涉及您的合法著作权、版权权益,请联系本人,核实后将第一时间删除、修改相关内容。