未透過Dispatcher或影響快取行為的自訂標頭
透過Dispatcher提供頁面時,自訂回應標頭(例如X-Robots-Tag、ETag和自訂快取標頭)會消失,或者在出現舊版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快取。 查詢字串請求會略過快取,使遺漏的標頭只出現在快取的路徑中。
如何確認
- 判斷標題在Dispatcher之前或之後是否遺失。 針對發佈和Dispatcher URL執行
curl -I並比較標題集。 如果標頭出現在發佈上,但在Dispatcher上遺失或修改,Dispatcher或Apache會將其移除。 如果Publish上已遺漏該程式碼,請先修正AEM程式碼。 - 檢查是否涉及Dispatcher快取。 使用查詢引數(
curl -I針對具有?a=b的URL進行重新測試。) 如果標題僅與查詢引數一起出現,則表示正在從快取中提供資源,但未儲存標題中繼資料。
解決方法 resolution
請依照下列步驟解決問題:
-
允許在伺服器陣列檔案中快取的標頭。 在發佈伺服器陣列
.any檔案中,將標頭名稱新增至/cache/headers區塊(例如:X-Robots-Tag、ETag或Edge-Cache-Tag)。 重新啟動並清除快取之後,請執行curl -I並確認標頭是否顯示。 -
請確定Apache在不覆寫標題的情況下轉送標題。 若為AMS和內部部署,請編輯vhost:
- 針對
ETag,新增FileETag None和Header unset ETag。 - 對於自訂標頭,請設定
SetEnvIfNoCase X-Robots-Tag "(.+)$" X_ROBOTS_TAG=$1和Header 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 ServerName或ServerAlias,然後再試一次。
驗證
- 對Dispatcher URL執行
curl -I並確認標題存在且符合發佈。 - 確認已在Dispatcher快取目錄中建立快取的中繼資料檔案(
<path>.headers)。 - 確認vhosts中不會保留非預期的標頭(例如
Vary: User-Agent),並在變更前後檢查CDN快取命中率。