0
0

[備忘] react-router-dom vs .htaccess 404 not found

Posted at

React初心者のわたし。ドキドキで本番環境へビルド。意外と動作するのでほっと胸をなでおろしていた。
ところがURL直打ちやリロードをすると404 not foundが返される。

解決した方法をときメモ。

まず、.htaccess ファイルで設定したリダイレクトがどのように機能しているのかを深く理解するために、以下のポイントを振り返る。

1. リダイレクトの仕組み

# すべてのリクエストをindex.htmlにリダイレクトする
# ただし、既存のファイルやディレクトリへのアクセスはそのまま許可
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^ index.html [L]

今回は上記の設定で解決した。.htaccess ファイルに記述した設定は、URLリクエストの処理に影響を与える。設定内容としては、index.html にリダイレクトする条件が書かれている。これはリクエストがサーバーに到達する際の処理であり、クライアントサイドのルーティング(React Routerなど)とは異なる動作をする。

2. リクエストとサーバーの役割

  • 最初のリクエスト(初期アクセス): たとえば、ユーザーが http://192.168.1.xxx/test というURLにアクセスすると、ApacheサーバーはそのURLに対応するファイルを探しにいく。
  • ファイルが存在しない場合: /test に対応するファイルやディレクトリが存在しないときに、.htaccess の設定が適用される。今回の場合だと、RewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-d がマッチし、RewriteRule ^ index.html [L] により、リクエストは index.html にルーティングされる。

3. リダイレクトと表示の違い

  • リダイレクト: RewriteRule ^ index.html [L] の設定は、サーバーがリクエストを処理する方法で、存在しないファイルやディレクトリへのリクエストが index.html で応答されるようになるが、クライアントサイドでの表示やルーティングには影響しない。
  • クライアントサイドのルーティング: index.html が読み込まれた後、React Router が実際のページの表示を管理する。index.html がブラウザに表示されると、React Router がURLに基づいて適切なコンポーネントをレンダリングしてくれる。便利。

4. リロードとブラウザの動作

  • 直接アクセス: ユーザーが /test というURLにアクセスすると、サーバーは .htaccess 設定に従い index.html を返す。
  • リロード: ブラウザでページをリロードしても、サーバーは再び index.html を返し、その後、React Router がURLに基づいて適切なコンポーネントを表示する。このおかげでユーザーがリロードしても、/test の内容が維持されるしくみ。

5. まとめ

  • .htaccess で設定したリダイレクトは、URLに対するリクエストの処理をサーバーサイドで制御するもので、リクエストに対して index.html を返すことが目的となる。
  • リダイレクトといっても、なんでもかんでもindex.html が表示されるわけではなく、React アプリケーションがその後のルーティングを制御してくれて正しいコンポーネント(例: /test)を表示してくれる。

React初心者のわたしを絶望の淵から助けてくれたのは .htaccess だった。結果的にはうれしいけど、検証中はブラウザキャッシュのせいで無駄に時間を使ってしまって苦労した・・・。おしまい。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0