AMP

AMP 快取網址格式和要求處理方式

在這份文件中,您將瞭解 AMP 快取網址格式及其處理要求的方式。

網址格式

在可能的情況下,Google AMP 快取會為每個 AMP 文件的網域建立子網域,方法是先將網域從 IDN (Punycode) 轉換為 UTF-8。快取會將每個 - (破折號) 取代為 -- (2 個破折號),並將每個 . (點) 取代為 - (破折號)。例如,pub.com 會對應到 pub-com.cdn.ampproject.org

您可以使用這個網址計算工具,將網址轉換為 AMP 快取版本

使用 AMP-Toolbox 快取網址 Node.js 模組,將網址從原始網域轉換為 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).

所有發布商網域都會對應到唯一的網域前綴。用於執行此操作的演算法會嘗試使對應具備人類可讀性。但是,如果發布商網域太長,以及在以下描述的情況下,對應會回復為使用安全雜湊。

基本演算法

將發布商網域轉換為網域前綴的基本演算法如下:

  1. Punycode 解碼發布商網域。請參閱 RFC 3492
  2. 將步驟 1 輸出的結果中的任何「-」(連字號) 字元取代為「--」(兩個連字號)。
  3. 將步驟 2 輸出的結果中的任何「.」(點) 字元取代為「-」(連字號)。
  4. 如果步驟 3 輸出的結果在位置 3 和 4 都具有「-」(連字號),則將「0-」前綴和「-0」後綴新增至步驟 3 的輸出。如需背景資訊,請參閱 #26205
  5. 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 標籤

回退演算法

將發布商網域轉換為網域前綴的回退演算法如下:

  1. 使用 SHA256 雜湊處理發布商網域。
  2. Base32 跳脫處理步驟 1 的輸出。
  3. 從步驟 2 的輸出中移除最後 4 個字元,這些字元一律為 = (等號) 字元。

回退演算法會產生一個 52 個字元的字串,例如以下字串,其中沒有 - (連字號):v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq

組合演算法

組合演算法為:

  1. 執行基本演算法。如果輸出為有效的 DNS 標籤,請附加快取網域後綴並傳回,例如 example-com.cdn.ampproject.org。否則請繼續執行步驟 2。
  2. 執行回退演算法。附加快取網域後綴並傳回,例如:v2c4ucasgcskftbjt4c7phpkbqedcdcqo23tkamleapoa5o6fygq.cdn.ampproject.org

網址路徑

AMP 快取上網址的「路徑」一律由一或多個前綴目錄 (例如 /c) 組成,後面接著 /s 中綴 (僅當發布商網址為 http s 時),然後是發布商文件的網址 (不含協定)。

前綴目錄 (例如 /c) 對應於 AMP 快取可能執行的不同服務類型。不同的 AMP 快取可能支援不同的服務類型,而且這並非詳盡的清單

  • /c - Content (內容):這是一個 AMP 文件,以獨立網頁的形式提供,在某些介面中可以直接連結到這個網頁。
  • /v - Viewer (檢視器):這也是一個 AMP 文件,但在 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 快取來源集。然後您可以根據固定集進行驗證。

演算法的其餘部分假設「網域前綴」包含至少一個「-」(連字號)。

  1. 如果網域前綴以 xn-- 開頭,請 Punycode 解碼「網域前綴」。例如,xn---com-p33b41770a 變成 ⚡😊-com。如需 Punycode,請參閱 RFC 3492
  2. 如果網域前綴以「0-」開頭,並以「-0」結尾,請移除「0-」前綴和「-0」後綴。
  3. 依序迭代步驟 2 輸出的字元,並在遇到字元時發出字元。當您遇到「-」(連字號) 時,請查看後面的字元。如果後面的字元也是「-」(連字號),請從輸入中跳過這兩個字元,並發出單個「-」(連字號)。如果後面的字元是任何其他字元,則僅跳過目前的單個「-」(連字號),並發出「.」(點)。例如,a--b-example-com 變成 a-b.example.com
  4. Punycode 編碼步驟 3 的結果。如需 Punycode,請參閱 RFC 3492

步驟 4 的結果將是發布商網域。協定無法從網域本身取得,但為 httphttps。連接埠一律為協定的預設連接埠。

重新導向和錯誤處理

以下是一些 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 快取將傳回原始網址已解析重新導向的內容。

範例:https://amp-dev.cdn.ampproject.org/amp.dev/documentation/examples/api/redirect?url=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