未透過Dispatcher或影響快取行為的自訂標頭

透過Dispatcher提供頁面時,自訂回應標頭(例如X-Robots-TagETag和自訂快取標頭)會消失,或者在出現舊版Vary: User-Agent指示詞時中斷CDN快取。 Dispatcher只會轉送在其/cache/headers/headers設定中明確列出的回應標頭,而Apache會覆寫一些標頭(例如ETag),除非要求延遲到AEM。 允許伺服器陣列設定中的標頭,確保Apache未修改即轉送它,移除舊的Vary: User-Agent指示詞,並清除快取以還原正確的標頭傳遞和快取。

說明 description

環境:

  • Adobe Experience Manager as a Cloud Service (AEMaaCS)
  • AEM Managed Services (AMS)
  • Adobe Experience Manager內部部署軟體
  • AEM Dispatcher (Apache)和CDN層

問題/症狀:

  • 標頭在具有curl -I的AEM發佈上可見,但在Dispatcher上遺失。
  • 由於Vary: User-Agent,CDN不會快取頁面。
  • 因為Dispatcher略過快取,所以只有在新增查詢引數(?a=b)時才會顯示自訂標頭。
  • ETag已遺失或修改,例如Apache附加-gzip
  • Dispatcher會傳回過時的內容,因為快取的標頭不會重新整理。

根本原因:

Dispatcher只轉送明確列於/cache/headers/headers中的回應標頭。 當標頭不存在時,Dispatcher會將其刪除或使用快取的標頭中繼資料。 Apache會覆寫標頭(例如ETag),除非已設定為遞延至AEM。 部分舊版vhost設定包含Header append Vary User-Agent,這會因為基數差異過大而中斷CDN快取。 查詢字串請求會略過快取,使遺漏的標頭只出現在快取的路徑中。

如何確認

  1. 判斷標題在Dispatcher之前或之後是否遺失。 針對發佈和Dispatcher URL執行curl -I並比較標題集。 如果標頭出現在發佈上,但在Dispatcher上遺失或修改,Dispatcher或Apache會將其移除。 如果Publish上已遺漏該程式碼,請先修正AEM程式碼。
  2. 檢查是否涉及Dispatcher快取。 使用查詢引數(curl -I針對具有?a=b的URL進行重新測試。) 如果標題僅與查詢引數一起出現,則表示正在從快取中提供資源,但未儲存標題中繼資料。

解決方法 resolution

請依照下列步驟解決問題:

  1. 允許在伺服器陣列檔案中快取的標頭。 在發佈伺服器陣列.any檔案中,將標頭名稱新增至/cache/headers區塊(例如: X-Robots-TagETagEdge-Cache-Tag)。 重新啟動並清除快取之後,請執行curl -I並確認標頭是否顯示。

  2. 請確定Apache在不覆寫標題的情況下轉送標題。 若為AMS和內部部署,請編輯vhost:

    • 針對ETag,新增FileETag NoneHeader unset ETag
    • 對於自訂標頭,請設定SetEnvIfNoCase X-Robots-Tag "(.+)$" X_ROBOTS_TAG=$1Header always set X-Robots-Tag "%{X-Robots-Tag}e" env=X_ROBOTS_TAG

執行apachectl -t,重新啟動服務,然後確認curl -I顯示標頭。
​3. 在伺服器陣列檔案中允許轉送(非快取)的標頭。 將標頭新增至/headers區塊,以便Dispatcher將標頭轉送給使用者端,即使未快取回應亦然,然後使用curl -I確認。
​4. 移除舊版Vary: User-Agent指示詞。 搜尋具有grep -R "Vary User-Agent" .的vhost目錄,並註解找到的任何執行個體,讓CDN繼續快取回應。
​5. 在設定變更後清除快取。 在AEMaaCS上,使用Cloud Manager →環境→清除快取。 在AMS或內部部署上,移除位於<dispatcher_cache_path>的快取檔案或觸發啟動排清,然後重新啟動Apache。 確認curl -I顯示正確的標頭。
​6. 驗證網域對伺服器陣列的對應。 確認vhost包含要求的網域,讓Dispatcher使用正確的發佈伺服器陣列搭配標頭規則。 檢查Dispatcher記錄檔中是否有 沒有符合主機 ​的陣列;如果出現,請將網域新增至vhost ServerNameServerAlias,然後再試一次。

驗證

  1. 對Dispatcher URL執行curl -I並確認標題存在且符合發佈。
  2. 確認已在Dispatcher快取目錄中建立快取的中繼資料檔案(<path>.headers)。
  3. 確認vhosts中不會保留非預期的標頭(例如Vary: User-Agent),並在變更前後檢查CDN快取命中率。

相關閱讀

recommendation-more-help
experience-cloud-kcs-help-kbarticles