Dispatcherを通過しない、またはキャッシュ動作に影響を与えないカスタムヘッダー
X-Robots-Tag、ETag、カスタムキャッシュヘッダーなどのカスタム応答ヘッダーは、ページがDispatcherを通じて提供されたときに消えるか、従来のVary: User-Agent ディレクティブが存在するとCDN キャッシュが壊れます。 Dispatcherは、/cache/headersおよび/headers設定に明示的にリストされている応答ヘッダーのみを転送し、AEMに従うよう指示されない限り、Apacheは一部のヘッダー(ETagなど)を上書きします。 ファーム設定でヘッダーを許可し、Apacheが変更せずにヘッダーを転送することを確認し、従来のVary: User-Agent ディレクティブを削除し、キャッシュをクリアすると、正しいヘッダーパススルーとキャッシュが復元されます。
説明 description
環境:
- Adobe Experience Manager as a Cloud Service (AEMaaCS)
- AEM Managed Services(AMS)
- Adobe Experience Manager On-Premises Software
- AEM Dispatcher(Apache)とCDN レイヤー
問題/症状:
- ヘッダーは
curl -IのAEM パブリッシュに表示されますが、Dispatcherには表示されません。 Vary: User-Agentのため、CDNはページをキャッシュしません。- カスタムヘッダーは、Dispatcherがキャッシュをバイパスするため、クエリパラメーター(
?a=b)が追加されたときにのみ表示されます。 ETagが失われたり、変更されたりします。例えば、-gzipがApacheに追加されています。- キャッシュされたヘッダーが更新されないので、Dispatcherは古いコンテンツを返します。
根本原因:
Dispatcherは、/cache/headersおよび/headersに明示的にリストされている応答ヘッダーのみを転送します。 ヘッダーが存在しない場合、Dispatcherはそれを削除するか、キャッシュされたヘッダーメタデータを使用します。 AEMに従うように設定されていない限り、Apacheはヘッダー(ETagなど)を上書きします。 一部のレガシーvhost設定にはHeader append Vary User-Agentが含まれており、過度に異なるカーディナリティが原因でCDN キャッシュが切断されます。 クエリ文字列リクエストはキャッシュをバイパスします。これにより、キャッシュされたパスにのみ不足しているヘッダーが表示されます。
確認方法
- Dispatcherの前または後にヘッダーが表示されないかどうかを確認します。 公開URLとDispatcher URLの両方に対して
curl -Iを実行し、ヘッダーセットを比較します。 ヘッダーがパブリッシュに表示されますが、Dispatcherで見つからないか変更されている場合は、DispatcherまたはApacheによって削除されます。 公開時に既に見つからない場合は、まず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 → Environment → Clear Cacheを使用します。 AMSまたはオンプレミスで、<dispatcher_cache_path>にキャッシュされたファイルを削除するか、アクティベーションフラッシュをトリガーしてからApacheを再起動します。 curl -Iが正しいヘッダーを示していることを確認してください。
6. ドメインからファームへのマッピングを検証します。 vhostにリクエストされたドメインが含まれていることを確認し、Dispatcherがヘッダールールで正しいパブリッシュファームを使用するようにします。 ファームがホストと一致しないか、Dispatcher ログを確認します。該当する場合は、vhost ServerNameまたはServerAliasにドメインを追加して、再試行してください。
検証
- Dispatcher URLに対して
curl -Iを実行し、ヘッダーが存在し、パブリッシュと一致することを確認します。 - キャッシュされたメタデータファイル (
<path>.headers)がDispatcher キャッシュディレクトリに作成されていることを確認します。 - vhostsに意図しないヘッダー(
Vary: User-Agentなど)が残っていないことを確認し、変更の前後でCDN キャッシュ ヒット率を確認します。