AMP 缓存 URL 格式和请求处理
在本文档中,您将了解 AMP 缓存 URL 格式以及它如何处理请求。
URL 格式
在可能的情况下,Google AMP 缓存将为每个 AMP 文档的域名创建一个子域名,方法是首先将其从 IDN(punycode) 转换为 UTF-8。缓存将每个 -
(破折号)替换为 --
(2 个破折号),并将每个 .
(点)替换为 -
(破折号)。例如,pub.com
将映射到 pub-com.cdn.ampproject.org
。
您可以使用此 URL 计算器将 URL 转换为 AMP 缓存版本
本文档描述了
- AMP 缓存上的 URL 结构。
- 如何预测您的 URL 将如何在 AMP 缓存上显示。
- 如何反转 AMP 缓存原始标头以确定其发布者域名。
域名协议
所有文档在 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)证书的限制,此前缀中不使用多个点分组件,例如 example.com.cdn.ampproject.org
,RFC 2818
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.
根据 RFC 2181,发布者域名长度最长可达 255 个字符,而每个域名前缀长度限制为 63 个字符,其中写道
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).
所有发布者域名都映射到一个唯一的域名前缀。这样做的算法尝试使映射可读。但是,如果发布者域名太长,则映射会恢复为对它们使用安全哈希,并在下面描述的情况下
基本算法
将发布者域名转换为域名前缀的基本算法如下
- Punycode 解码发布者域名。请参阅 RFC 3492
- 用“
--
”(两个连字符)替换步骤 1 输出中的任何“-
”(连字符)字符。 - 用“
-
”(连字符)替换步骤 2 输出中的任何“.
”(点)字符。 - 如果步骤 3 的输出在位置 3 和 4 都有“
-
”(连字符),则在步骤 3 的输出中添加“0-
”前缀和“-0
”后缀。有关背景信息,请参阅 #26205。 - Punycode 编码步骤 3 的输出。请参阅 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 标签
回退算法
将发布者域名转换为域名前缀的回退算法如下
- 使用 SHA256 对发布者的域名进行哈希处理。
- 对步骤 1 的输出进行 Base32 转义。
- 从步骤 2 的输出中删除最后 4 个字符,这些字符始终是
=
(等于)字符。
回退算法将生成一个 52 个字符的字符串,如下所示,不带 -
(连字符):v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq
。
组合算法
组合算法是
- 运行基本算法。如果输出是有效的 DNS 标签,则追加缓存域名后缀并返回,例如
example-com.cdn.ampproject.org
。否则继续执行步骤 2。 - 运行回退算法。追加缓存域名后缀并返回,例如:
v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq.cdn.ampproject.org
URL 路径
AMP 缓存中 URL 的“路径”始终由一个或多个前缀目录组成,例如 /c
,然后是 /s
中缀(仅当发布者 URL 为 http s
时),然后是发布者文档的 URL(不带协议)。
前缀目录(例如 /c
)对应于 AMP 缓存可能执行的不同类型的服务。不同的 AMP 缓存可能支持不同的服务类型,这不是一个详尽的列表
/c
- Content:这是一份 AMP 文档,作为独立页面提供,在某些界面中可直接链接到。/v
- Viewer:这也是一份 AMP 文档,但提供于 AMP 查看器 中,这是一个框架环境,在搜索结果页面或其他界面中显示 AMP 文档。/wp
- Web Package:这是一份 AMP 文档,作为 签名交换 提供,这是一种 Web Package 技术。这些 URL 充当重定向到发布者自身来源的链接。/cert
- Certificate:这是用于 签名交换 的公有证书。/i
- Image:这是由 AMP 缓存提供的图片,通常作为文档子资源。/ii
- Image:这也是由 AMP 缓存提供的图片,但通常可以与其他缓存配置参数结合使用,例如/ii/w800
,表示文档请求的最大宽度。缓存可以在这里生成不同比例的图片,以节省浏览器的带宽。
此外,AMP 缓存可以选择将特殊查询参数附加到文档 URL,这些参数不属于发布者文档查询。例如,<amp-live-list>
通过获取带有参数 amp_latest_update_time<
的文档来发出刷新请求。当抓取文档时,这些参数不会传递到来源,但严格存在于配置对 AMP 缓存的请求。
CORS 来源
许多发布者从其 AMP 文档中使用 CORS 请求来检索额外数据。CORS 请求通过在请求中发送指定发出请求的文档来源的 Origin:
HTTP 标头来工作。如上所述,文档的来源在 AMP 缓存中与原始文档中不同。在上面的域名部分中,你可以找到用于确定给定发布者 URL 的 AMP 缓存来源的算法。下面我们指定了反向算法,用于将 CORS Origin:
请求标头解码回原始发布者域名。
AMP 缓存来源到发布者域名
AMP 缓存源标头值将类似于以下示例之一
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 缓存源的集合。然后,您可以针对固定集合进行验证。
算法的其余部分假设“域名前缀”至少包含一个“-
”(连字符)。
- 如果域名前缀以
xn--
开头,则对“域名前缀”进行 punycode 解码。例如,xn---com-p33b41770a
变为⚡😊-com
。有关 punycode,请参见 RFC 3492。 - 如果域名前缀以 "
0-
" 开头并以 "-0
" 结尾,请同时删除 "0-
" 前缀和 "-0" 后缀。 - 按顺序迭代步骤 2 输出的字符,在遇到时将其输出。当您遇到“
-
”(连字符)时,请查看以下字符。如果以下字符也是“-
”(连字符),请从输入中跳过这两个字符并输出一个“-
”(连字符)。如果以下字符是任何其他字符,请仅跳过当前单个“-
”(连字符)并输出一个“.
”(点)。例如,a--b-example-com
变为a-b.example.com
。 - 对步骤 3 的结果进行 punycode 编码。有关 punycode,请参见 RFC 3492。
步骤 4 的结果将是发布商域名。协议在域名本身不可用,但为 http
或 https
。端口始终是协议的默认端口。
重定向和错误处理
以下是 AMP 缓存处理重定向和错误的一些示例
重定向
AMP 缓存会在解析 AMP 网址时遵循重定向。例如,如果一个网址重定向到另一个 AMP 网址
$ 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 缓存将为原始网址返回已解析重定向的内容。
未找到
当在 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
服务器错误
如果一个网址返回 5XX 服务器错误,AMP 缓存将返回 404 状态。
示例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/server-error
-
由 @Gregable 撰写
由 @sebastianbenz 协助完成