AMP

AMP 缓存网址格式和请求处理

在本文档中,您将了解 AMP 缓存网址格式及其如何处理请求。

网址格式

如果可能,Google AMP 缓存将通过首先将每个 AMP 文档的域名从 IDN (punycode) 转换为 UTF-8,为其创建一个子域。缓存会将每个 - (短划线) 替换为 -- (两个短划线),并将每个 . (点) 替换为 - (短划线)。例如,pub.com 将映射到 pub-com.cdn.ampproject.org

您可以使用此 URL 计算器将 URL 转换为 AMP 缓存版本

使用 AMP-Toolbox 缓存 URL Node.js 模块将 URL 从原始域转换为 AMP 缓存 URL 格式。

本文档介绍了

  • AMP 缓存上的 URL 结构。
  • 如何预测您的 URL 在 AMP 缓存上的外观。
  • 如何反转 AMP 缓存 Origin 标头以确定其发布者域名。

域名协议

所有文档在 AMP 缓存上都使用 https 协议。

域名后缀

所有 AMP 缓存都注册在一个 JSON 文件中,该文件可在 AMPHTML 存储库 上在线找到。此文件中的示例缓存记录如下所示

{
  "id": "google",
  "name": "Google AMP Cache",
  "docs": "https://developers.google.com/amp/cache/",
  "cacheDomain": "cdn.ampproject.org",
  "updateCacheApiDomainSuffix": "cdn.ampproject.org",
  "thirdPartyFrameDomainSuffix": "ampproject.net"
},

AMP 缓存在 cacheDomain 指定的域上提供记录。在本例中,该域是 cdn.ampproject.org

本文档使用以 cdn.ampproject.org 为例的 URL,但其他缓存通常使用类似的 URL 结构。

域名前缀

AMP 缓存在修改后的 URL 上提供文档,例如 example-com.cdn.ampproject.org。示例中原始域名 example.com 的第一个点分隔部分变为 example-com。本文档将此非点分隔字符串 example-com 称为“域名前缀”。有关执行此转换的算法,请参见下文。

由于 https (TLS) 证书的约束,RFC 2818,此前缀中不使用多个点分隔部分,例如 example.com.cdn.ampproject.org

Names may contain the wildcard character * which is considered to match any single domain name component or component fragment. E.g., *.a.com matches foo.a.com but not bar.foo.a.com.

发布者域名长度最多可以为 255 个字符,而根据 RFC 2181,每个域名前缀限制为 63 个字符,该 RFC 内容如下

The length of any one label is limited to between 1 and 63 octets.  A full domain name is limited to 255 octets (including the separators).

所有发布者域名都映射到唯一的域名前缀。执行此操作的算法试图使映射具有人类可读性。但是,如果发布者域名太长,并且在下述情况下,映射会还原为使用安全哈希

基本算法

将发布者域名转换为域名前缀的基本算法如下

  1. 对发布者域名进行 Punycode 解码。请参见 RFC 3492
  2. 将步骤 1 输出中的任何 "-" (连字符) 字符替换为 "--" (两个连字符)。
  3. 将步骤 2 输出中的任何 "." (点) 字符替换为 "-" (连字符)。
  4. 如果步骤 3 的输出在第 3 和 4 位都带有 "-" (连字符),则在步骤 3 的输出中添加前缀 "0-" 和后缀 "-0"。有关背景信息,请参见 #26205
  5. 对步骤 3 的输出进行 Punycode 编码。请参见 RFC 3492

基本算法的一些示例

发布者域名 域名前缀
example.com example-com
foo.example.com foo-example-com
foo-example.com foo--example-com
xn--57hw060o.com (⚡😊.com) xn---com-p33b41770a (⚡😊-com)
en-us.example.com 0-en--us-example-com-0

仅当域名前缀不是有效的 DNS 标签时,在运行基本算法后,我们才运行下面描述的回退算法。

如果域名前缀的长度超过 63 个字符,则它不是有效的 DNS 标签

回退算法

将发布者域名转换为域名前缀的回退算法如下

  1. 使用 SHA256 哈希发布者的域名。
  2. 对步骤 1 的输出进行 Base32 转义。
  3. 从步骤 2 的输出中删除最后 4 个字符,它们始终是 = (等于) 字符。

回退算法将生成一个 52 个字符的字符串,例如以下字符串,其中没有 - (连字符):v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq

组合算法

组合算法是

  1. 运行基本算法。如果输出是有效的 DNS 标签,则附加缓存域名后缀并返回,例如 example-com.cdn.ampproject.org。否则,继续执行步骤 2。
  2. 运行回退算法。附加缓存域名后缀并返回,例如:v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq.cdn.ampproject.org

网址路径

AMP 缓存上 URL 的“路径”始终由一个或多个前缀目录组成,例如 /c,后跟 /s 中缀(仅当发布者 URL 为 http s 时),后跟不带协议的发布者文档的 URL。

前缀目录(例如 /c)对应于 AMP 缓存可能执行的不同类型的服务。不同的 AMP 缓存可能支持不同的服务类型,这不是一个详尽的列表

  • /c - Content:这是一个作为独立页面提供的 AMP 文档,可以在某些界面中直接链接到该文档。
  • /v - Viewer:这也是一个 AMP 文档,但它在 AMP Viewer 中提供,这是一个框架环境,用于在搜索结果页或其他界面的上下文中显示 AMP 文档。
  • /wp - Web Package:这是一个作为 Signed Exchange(一种 Web Package 技术)提供的 AMP 文档。这些 URL 充当重定向到发布者自己域的重定向。
  • /cert - Certificate:这是用于 Signed Exchange 的公共证书。
  • /i - Image:这是由 AMP 缓存提供的图像,通常作为文档子资源。
  • /ii - Image:这也是由 AMP 缓存提供的图像,但通常可以与其他缓存配置参数(例如 /ii/w800)结合使用,后者表示文档请求的最大宽度。缓存可以在此处生成具有不同比例的图像,以便为浏览器节省带宽。

此外,AMP 缓存可能会选择将特殊查询参数附加到文档 URL,这些参数不是发布者文档查询的一部分。例如,<amp-live-list> 通过使用参数 amp_latest_update_time< 来获取文档来发出刷新请求。这些参数不会在抓取文档时传递给原始域,但严格来说,它们的存在是为了配置对 AMP 缓存的请求。

CORS Origin

许多发布者使用来自其 AMP 文档的 CORS 请求来检索额外数据。CORS 请求通过在请求中发送 Origin: HTTP 标头来工作,该标头指定发出请求的文档的来源。如上所示,在 AMP 缓存上,文档的来源与原始文档上的来源不同。在上面的域名部分中,您可以找到给定发布者 URL 的 AMP 缓存 URL 的来源确定算法。下面,我们指定将 CORS Origin: 请求标头解码回原始发布者域的反向算法。

AMP 缓存 Origin 到发布者域名

AMP 缓存 Origin 标头值将类似于以下示例之一

  • https://www-example-com.cdn.ampproject.org
  • https://v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq.cdn.ampproject.org

首先,删除协议前缀 (https://) 和 AMP 缓存域名后缀,例如 .cdn.ampproject.org。后缀可以是 caches.json 中列出的任何一个缓存的后缀。剩余的字符串将是“域名前缀”。在上述两个示例中,“域名前缀”为

  • www-example-com
  • v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq

接下来,检查“域名前缀”是否包含至少一个 ‘-’ (连字符)。包含一个或多个连字符是迄今为止最常见的情况。如果“域名前缀”不包含至少一个 ‘-’ (连字符),则无法直接反转 AMP 缓存来源。相反,如果您知道可能的发布者域名的集合,您可以使用本文档前面所述的域名算法创建 AMP 缓存来源的集合。然后,您可以针对固定的集合进行验证。

该算法的其余部分假设“域名前缀”包含至少一个 ‘-’ (连字符)。

  1. 如果域名前缀以 xn-- 开头,则对“域名前缀”进行 punycode 解码。例如,xn---com-p33b41770a 变为 ⚡😊-com。请参阅 RFC 3492 以了解 punycode。
  2. 如果域名前缀以 "0-" 开头,并以 "-0" 结尾,则去除 "0-" 前缀和 "-0" 后缀。
  3. 按顺序迭代步骤 2 输出的字符,按遇到的顺序发出它们。当您遇到 “-” (连字符) 时,查看后面的字符。如果后面的字符也是 “-” (连字符),则跳过输入中的两个字符,并发出一个 “-” (连字符)。如果后面的字符是任何其他字符,则仅跳过当前的单个 “-” (连字符) 并发出一个 “.” (点)。例如,a--b-example-com 变为 a-b.example.com
  4. 对步骤 3 的结果进行 punycode 编码。请参阅 RFC 3492 以了解 punycode。

步骤 4 的结果将是发布者域名。协议本身无法从域名中获得,但它是 httphttps。端口始终是协议的默认端口。

重定向和错误处理

以下是一些关于 AMP 缓存如何处理重定向和错误的示例

重定向

AMP 缓存在解析 AMP URL 时会跟踪重定向。例如,如果一个 URL 重定向到另一个 AMP URL

$ curl -I https://amp.org.cn/documentation/examples/api/redirect?url=https://amp.org.cn/index.amp.html
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https://amp.org.cn/index.amp.html
...

那么 AMP 缓存将为原始 URL 返回已解析的重定向的内容。

示例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/redirect?url=https://amp.org.cn/index.amp.html

如果您在服务器上移动 AMP 文件的位置,请确保设置从旧位置到新位置的重定向。

未找到

当在 AMP 缓存中找不到页面时,它将显示错误页面并返回 404 状态。

示例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/not-found

无效的 AMP

当页面是无效的 AMP 时,AMP 缓存将重定向到规范页面。

示例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/invalid-amp

服务器错误

如果一个 URL 返回 5XX 服务器错误,AMP 缓存将返回 404 状态。

示例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/server-error