AMP 快取網址格式與請求處理
在這份文件中,您將瞭解 AMP 快取網址格式及其處理請求的方式。
網址格式
在可能的情況下,Google AMP 快取會為每個 AMP 文件的網域建立子網域,方法是先將網域從 IDN (Punycode) 轉換為 UTF-8。快取會將每個 -
(破折號) 取代為 --
(兩個破折號),並將每個 .
(點) 取代為 -
(破折號)。例如,pub.com
將會對應到 pub-com.cdn.ampproject.org
。
您可以使用此網址計算器將網址轉換為 AMP 快取版本
本文說明
- AMP 快取上的網址結構。
- 如何預測您的網址在 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
作為範例,但其他快取通常使用類似的網址結構。
網域名稱前綴
AMP 快取會在經過修改的網址 (例如 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 個字元,而每個網域前綴則限制為 63 個字元,如 RFC 2181 所述,其中提到:
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 雜湊發布者的網域。
- Base32 跳脫步驟 1 的輸出。
- 從步驟 2 的輸出中移除最後 4 個字元,這些字元一律為
=
(等號) 字元。
備用演算法會產生一個 52 個字元的字串,例如以下不含 -
(連字號) 的字串:v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq
。
組合演算法
組合演算法為:
- 執行基本演算法。如果輸出是有效的 DNS 標籤,請附加快取網域後綴並傳回,例如
example-com.cdn.ampproject.org
。否則請繼續步驟 2。 - 執行備用演算法。附加快取網域後綴並傳回,例如:
v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq.cdn.ampproject.org
網址路徑
AMP 快取上網址的「路徑」一律由一或多個前綴目錄 (例如 /c
) 組成,後面接著 /s
中綴 (僅在發布者網址為 http s
的情況下),然後是發布者文件的網址 (不含協定)。
前綴目錄 (例如 /c
) 對應於 AMP 快取可能執行的不同服務類型。不同的 AMP 快取可能支援不同的服務類型,而這並非詳盡的清單
/c
- Content (內容):這是一個 AMP 文件,以獨立頁面的形式提供,可以直接連結到某些介面。/v
- Viewer (檢視器):這也是一個 AMP 文件,但在 AMP 檢視器中提供,這是一個框架環境,可在搜尋結果頁面或其他介文脈中顯示 AMP 文件。/wp
- Web Package (網路封包):這是一個以 Signed Exchange (網路封包技術) 形式提供的 AMP 文件。這些網址會作為重新導向至發布者自身原始網址的用途。/cert
- Certificate (憑證):這是用於 Signed Exchange 的公開憑證。/i
- Image (圖片):這是由 AMP 快取提供的圖片,通常作為文件子資源。/ii
- Image (圖片):這也是由 AMP 快取提供的圖片,但通常可以與其他快取設定參數結合使用,例如/ii/w800
,表示文件要求的最大寬度。快取可以在此處產生不同比例的圖片,以便為瀏覽器節省頻寬。
此外,AMP 快取可能會選擇在文件網址中附加特殊查詢參數,這些參數並非發布者文件查詢的一部分。例如,<amp-live-list>
透過擷取具有參數 amp_latest_update_time<
的文件來發出重新整理請求。這些參數在檢索文件時不會傳遞至原始網址,而是嚴格來說僅用於設定對 AMP 快取的請求。
CORS 來源
許多發布者會從其 AMP 文件使用 CORS 請求來擷取額外資料。CORS 請求的運作方式是在請求中傳送 Origin:
HTTP 標頭,以指定發出請求的文件來源。如上所示,文件來源在 AMP 快取上與在原始文件上不同。在上述網域名稱章節中,您可以找到根據發布者網址判斷 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
。 - Punycode 編碼步驟 3 的結果。如需 Punycode,請參閱 RFC 3492。
步驟 4 的結果將會是發布者網域。協定無法從網域本身取得,但為 http
或 https
。連接埠一律為協定的預設值。
重新導向與錯誤處理
以下是一些範例,說明 AMP 快取如何處理重新導向和錯誤
重新導向
AMP 快取在解析 AMP 網址時會遵循重新導向。例如,如果網址重新導向至另一個 AMP 網址
$ curl -I https://amp.dev.org.tw/documentation/examples/api/redirect?url=https://amp.dev.org.tw/index.amp.html
HTTP/1.1 301 Moved Permanently
Content-Type: text/html; charset=utf-8
Location: https://amp.dev.org.tw/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