🌐
Next.jsでリダイレクト設定が別プロジェクトにも影響する→ブラウザキャッシュが原因だった。
たとえば、あるプロジェクトAでnext.config.mjs
に以下のようなリダイレクト設定を入れているとします。
/** @type {import('next').NextConfig} */
const nextConfig = {
async redirects() {
return [
{
source: '/',
destination: '/login',
permanent: true, // 301リダイレクト(恒久的)
},
];
},
};
export default nextConfig;
上記の設定では、localhost:3000
へアクセスすると必ず/login
ページへリダイレクトされるようになります。
プロジェクトAでの動作確認
-
yarn dev
コマンドでプロジェクトAを起動し、localhost:3000
へアクセス。 - 期待通り、
/login
へリダイレクトされることを確認。
ここまでは想定通りの挙動です。
プロジェクトをBへ切り替える
次に、あなたは別のプロジェクトBへ移動し、同様にyarn dev
でサーバーを起動するとします。
ここで重要なのは、プロジェクトBではnext.config.mjs
にリダイレクト設定が一切ないという点です。
しかし、先ほどと同様にlocalhost:3000
へアクセスしてみると、なぜか再び/login
へリダイレクトされてしまいます。
「プロジェクトBにはそんな設定入れていないのに、なんで勝手に/login
へ飛ばされるんだ?」という疑問が生まれます。
なぜこのような現象が起きるのか?
この原因は、ブラウザ側がリダイレクト結果をキャッシュしていることにあります。
- プロジェクトAで
/
→/login
への301リダイレクトをブラウザが受け取った。 - ブラウザは「
localhost:3000
は常に/login
へリダイレクトする」といった情報をキャッシュとして記憶。 - プロジェクトAのサーバーが止まっているにもかかわらず、同一の
localhost:3000
というエンドポイントへアクセスした際、ブラウザは過去のキャッシュを使い、/login
へのリダイレクトを勝手に適用してしまう。
その結果、プロジェクトB(リダイレクト設定なし)を起動しても、ブラウザは過去に取得したリダイレクト情報を参照して、再び/login
へ飛ばしてしまうわけです。
解決策:キャッシュのクリア・ハードリロード
この問題のシンプルな解決方法は、ブラウザキャッシュをクリアしてハードリロードすることです。
以下は、Chromeの場合の一例です。
- Chromeで対象タブを開いた状態で開発者ツール(DevTools)を起動します。
- Windows:
Ctrl + Shift + I
- Mac:
Command + Option + I
- Windows:
- アドレスバー左にあるリロードボタン(丸い矢印)を右クリックします。
- 「キャッシュの消去とハード再読み込み」を選択します。
これにより、ブラウザが持っていたリダイレクトのキャッシュがクリアされます。
再度localhost:3000
を開いてみると、プロジェクトBでは/login
へのリダイレクトが発生せず、本来のトップページが表示されるはずです。
まとめ
-
next.config.mjs
でリダイレクト設定を行ったプロジェクトAをテストした後、別のプロジェクトBでも不本意なリダイレクトが続く場合は、ブラウザがリダイレクト結果をキャッシュしている可能性が高いです。 - この問題は、ブラウザのキャッシュをクリアしてハードリロードを行うことで簡単に解決できます。
同じような状況に陥った場合は、ぜひこの方法を試してみてください。
Discussion