課題: ALB + CloudFront 構成において、特定ホスト名へのアクセス時、CloudFront のキャッシュ有効期間中だけ 301 リダイレクトループが発生していた。
解決した課題
- ALB + CloudFront 構成において、特定ホスト名へのアクセス時、CloudFront のキャッシュ有効期間中だけ 301 リダイレクトループが発生していた。
https://example.com/abc/ へアクセスすると、ALB により https://www.example.com/abc/ へ 301 リダイレクトされる構成になっていた。
- しかし、その 301 レスポンスが CloudFront にキャッシュされた結果、
https://www.example.com/abc/ へアクセスした場合にも同じ 301 が返され、https://www.example.com/abc/ → https://www.example.com/abc/ の自己リダイレクトとなっていた。
- このため、キャッシュ有効期間中のみリダイレクトループが発生する状態となっていた。
対応内容
- 原因の整理:ホスト名正規化をALB側で実施していたため、CloudFrontがALBの返す301レスポンスをホスト差異を十分に分離しない形でキャッシュ・再利用し、意図しない自己リダイレクトが起きていた。
- 正規化ポイントの見直し:
- CloudFront Functions を追加し、
example.com へのアクセスは CloudFront 側で www.example.com へ 301 リダイレクトする構成に変更した。
- これにより、ホスト名正規化をオリジン到達前に完結させ、ALB にホスト正規化を依存させない設計へ改めた。
- 既存キャッシュの除去:
- CloudFront の invalidation を実施し、すでにキャッシュされていた誤った 301 レスポンスを削除した。
- 構成変更後も古いキャッシュが残ると再発したように見えるため、切替時にキャッシュ削除まで含めて対応した。
- 確認:
example.com でアクセスした場合は CloudFront で一度だけ www.example.com へ正規化されることを確認した。
www.example.com へ直接アクセスした場合は、自己リダイレクトが発生せず正常応答となることを確認した。
- キャッシュ有効期間中・削除後の両方で挙動を確認し、再発がないことを確認した。
結果
- CloudFront で
example.com → www.example.com の正規化を先に実施することで、ALB が返すホスト正規化用 301 を CloudFront がキャッシュ・再利用する経路を排除できた。
- その結果、
www.example.com への自己リダイレクトは発生しなくなり、キャッシュ有効期間中だけ起きていたリダイレクトループは解消した。
- ホスト名正規化の責務をCDN側に寄せることで、オリジン側のリダイレクトとキャッシュの干渉を避けやすい構成に整理できた。