Docker開発環境で http://localhost にアクセスしたら本番サイトにリダイレクトされる現象に遭遇した。シークレットモードでは正常に動作するのにもかかわらず通常モードではダメだったので、原因を調べた備忘録。
起きた問題
Docker開発環境で http://localhost にアクセスすると、本番サイトにリダイレクトされてしまう。
DevTools の Network タブで確認すると、以下のようなレスポンスが返っていた。
リクエスト URL: http://localhost/
ステータス コード: 301 Moved Permanently (ディスク キャッシュから)
シークレットモードでは正常に表示されるのに、通常モードでは再現するという状態だった。
原因
過去に http://localhost が 301 Moved Permanently を返したことがあり、ブラウザがそのリダイレクト先をディスクキャッシュに保存していた。
今回のケースでは、Docker環境に本番用のリダイレクト設定(.htaccessやnginxの設定など)が含まれており、localhostへのアクセスに対しても301が返されていたことが原因だった。
301(恒久的移転)はブラウザに「このURLは永久に移転した」と伝えるステータスコードで、多くのブラウザでは次回以降 サーバーに問い合わせることなく キャッシュからリダイレクトを実行する。そのため、サーバー側を修正してもブラウザが古い301をキャッシュしている限り反映されない。
301と302の違い
| ステータス | 意味 | ブラウザの挙動 |
|---|---|---|
| 301 Moved Permanently | 恒久的な移転 | リダイレクトをキャッシュする(次回サーバーに聞かない) |
| 302 Found | 一時的な移転 | 通常は毎回サーバーに問い合わせる |
解決方法
方法1: ブラウザのキャッシュを削除(確実)
chrome://settings/clearBrowserData
- 期間:全期間
- 「キャッシュされた画像とファイル」にチェック
- データを削除
方法2: DevTools でキャッシュ無効化して再読み込み
- F12 で DevTools を開く
- Network タブで 「Disable cache」にチェック
- Ctrl+Shift+R(ハードリロード)で再読み込み
- 正常に表示されたら「Disable cache」のチェックを外してOK
※ Disable cache を外した後に再びキャッシュが使われる場合は、方法1を試してください。
効果がない対処法
HSTS の削除(chrome://net-internals/#hsts)
HSTS は HTTP → HTTPS の強制に関する仕組みであり、301リダイレクトのキャッシュとは別物。今回のような「localhost → 本番ドメイン」へのリダイレクトには効果がない。
検索すると HSTS の削除を勧める記事が出てくることがあるが、問題の性質が異なるので注意。
まとめ
- ローカル開発で301リダイレクトが発生すると、サーバーを直してもブラウザが古いキャッシュを使い続ける
- 「シークレットモードでは動くが通常モードでは動かない」場合は、まず**ブラウザキャッシュ(特に301キャッシュ)**を疑う
- 開発中のリダイレクトには301ではなく 302 を使うことで、この問題を回避できる
- 特に
localhostのような再利用されるホスト名では、301の設定が残らないよう注意する
※ この記事は Claude Code で作成しています。