React Routerのページ再読み込み時の破損と解決方法
By hungpd, at: 2025年6月1日18:16
Estimated Reading Time: __READING_TIME__ minutes


問題:
React アプリで React Router (例:BrowserRouter)を使用している場合、リンクをクリックするとアプリは完璧に動作します。しかし、ページを更新するか、/joblist のようなURLに直接アクセスすると、サーバーから404 Not Foundエラーが返されます。
原因:
React Routerはクライアントサイドルーティングソリューションです。ブラウザは/joblistに対してサーバーにリクエストを送信しますが、サーバーはそのパスを認識しません。Reactアプリを提供し、React Routerに処理させる必要があることをサーバーは知りません。
解決策:すべてのルートをindex.htmlにリダイレクトする
Webサーバー(Apache、Nginx、Expressなど)を構成して、不明なパスすべてに対してindex.htmlを提供する必要があります。これにより、アプリがロードされるとReact Routerがルーティングを引き継ぎます。
例(Nginx):
location / {
try_files $uri /index.html;
}
例(Express.js):
app.use((req, res, next) => {
res.sendFile(path.join(__dirname, 'build', 'index.html'));
});
この解決策の長所と短所
長所
-
ページの更新時やURLへの直接アクセス時の404エラーを完全に解決します。
-
React RouterのBrowserRouterとシームレスに動作し、#なしのクリーンなURLを実現します。
-
SEOとURLの共有性を向上させます(ハッシュベースのルーティングと比較して)。
-
Netlify、Vercel、Firebase Hostingなどのほとんどの静的ホストでは設定が簡単です(組み込みのリライトルールがあります)。
短所
-
サーバーの構成が必要です。共有ホスティング環境によってはアクセスできない場合があります。
-
従来のサーバーサイドルートとは直接使用できません。慎重に処理しない限り(例:APIルートは除外する必要があります)。
-
すべてのパスをReactに公開する可能性があります。これは、安全なサーバー専用ルートがある場合に望ましくない場合があります。
-
リライトルールを有効にしない限り、静的ファイルのみのホスティング(例:基本的なS3)には適していません。
最後に
本番環境でBrowserRouterを使用している場合は、SPA(シングルページアプリケーション)ルーティングのためにサーバーを構成することが不可欠です。この修正は業界標準ですが、サーバーがルーティングを処理する方法を理解する必要があります。
Netlify、Vercel、またはFirebaseを使用している場合はお知らせください。正確なリライトルールを提供できます。よろしいですか?