検索
ホームページウェブフロントエンドjsチュートリアル反応ルーターのブラウザ履歴更新ページ 404 問題を解決する方法

React を使用して新しいプロジェクトを開発する場合、ページを更新して二次または三次ルーティングに直接アクセスすると、アクセスが失敗し、404 またはリソース読み込み例外が発生します。この記事では、この問題を分析し、解決策をまとめます。この記事では、react-router のブラウザ履歴更新ページの 404 問題の解決策を主に紹介します。困っている人はぜひ参考にしてください。

背景

webpack-dev-server をローカル開発サーバーとして使用する場合、通常の状況では、単に webpack-dev-server コマンドを使用するだけで起動できます。ただし、プロジェクトが次の 2 つの状況では、多くの場合、組み込みの Set ルーティングと非同期ロード ルーティングが必要になります。

  1. シングルページ アプリケーションのルーティングを構築するには、react-router などのルーティング ライブラリを使用します

  2. を使用します。 -plugin ロードされた js の <script> タグを HTML ドキュメントに動的に挿入するプラグイン ;</script>

この時点では、localhost:9090 にアクセスするとページと js およびその他のファイルが正常にロードされますが、第 2 レベルまたは第 3 レベルのルーティングにアクセスするか、localhost:9090/posts/92 などのページを更新する必要がある場合があります。次の 2 つの状況が考えられます:

  1. ページの読み込みに失敗し、ページを取得できない(404) が返されます。

  2. サービスは応答しますが、Webpack 処理によって出力された HTML ファイルが返されないため、js リソースを読み込めなくなります。 2 番目の状況は、図に示すとおりです。

  3. それでは、通常のアクセスを保証するために、各ページのルーティングをどのように処理すればよいでしょうか?ブロガーはソースを追跡し、ドキュメントの構成を検索して問題を解決しました。この記事は、問題解決プロセス全体の概要です。

問題を分析する


問題を発見したら、この問題は一般に次の 2 つの理由によって引き起こされていると判断します:

react-router road フロントエンド構成。 ;

  1. webpack-dev-server サービス構成

  2. react-router

フロントエンドルーティングは問題を特定しやすく、分析に便利であり、react-router に慣れているためです。まず、react-router ルーティング ライブラリにクエリを実行します。 関連する設定情報については、browserHistory を使用すると実際の URL が作成され、ルートにジャンプした後の初期/リクエストの処理には問題がないことがドキュメントに記載されていることがわかりました。ページを更新したり、URL に直接アクセスしたりすると、正しく応答できないことがわかります。詳細については、リファレンス ドキュメントを参照してください。このドキュメントには、いくつかのサーバー構成ソリューションも記載されています。サービスとして、ワイルドカード * を使用してすべてのリクエストをリッスンし、ターゲットの HTML ドキュメント (リソースの js html を引用) を返す必要があります。

Nginx


nginx サーバーを使用している場合は、try_files ディレクティブのみを使用する必要があります:


const express = require(&#39;express&#39;)
const path = require(&#39;path&#39;)
const port = process.env.PORT || 8080
const app = express()

// 通常用于加载静态资源
app.use(express.static(__dirname + &#39;/public&#39;))

// 在你应用 JavaScript 文件中包含了一个 script 标签
// 的 index.html 中处理任何一个 route
app.get(&#39;*&#39;, function (request, response){
 response.sendFile(path.resolve(__dirname, &#39;public&#39;, &#39;index.html&#39;))
})

app.listen(port)
console.log("server started on port " + port)


Apache

Apache サーバーを使用している場合は、 。 ht でプロジェクトのルート ディレクトリにアクセスします。 ファイルには次の内容が含まれています:


server {
 ...
 location / {
  try_files $uri /index.html
 }
}

残念ながら、関連するサーバーはまだ導入されておらず、webpack の組み込みサービスを使用しているだけです。 -dev-server を使用しましたが、問題が見つかりました。問題は、ルーティング リクエストが返された HTML ドキュメントと一致しないことです。そのため、webpack-dev-server ドキュメントで解決策を見つける必要があります。

webpack-dev-server

このブロガーは、問題を明確に理解するまでに、公式の webpack-dev-server ドキュメントについて文句を言わなければなりません。ここには 2 つの状況があります。 Output.publicPath は変更されていません。つまり、Webpack 設定ファイルに宣言された値がありません。これがデフォルトです。


output.publicPath をカスタム値に設定します。


ドキュメントを表示するには、ここをクリックしてください。


デフォルト

    デフォルトでは、output.publicPath 値は変更されません。webpack-dev-server のhistoryApiFallback 設定を設定するだけです:
  1. RewriteBase /
    RewriteRule ^index\.html$ - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . /index.html [L]

    HTML5 履歴を使用している場合。 API はおそらく 404 応答の代わりにインデックスを提供する必要があります。これは、historyApiFallback: true を設定することで実行できます

アプリケーションが HTML5 履歴 API を使用している場合、404 または質問リクエストの場合は、historyApiFallback: true を設定するだけです


カスタム値

ただし、Webpack 設定で Output.publicPath を変更した場合は、リダイレクト先の URL を指定する必要があります。これは、historyApiFallback.index オプションを使用して行われます。

Webpack 設定で Output.publicPath を変更した場合は、リダイレクト先の URL を指定する必要があります。ファイル内で Output.publicPath 値が変更されている場合は、リクエストのリダイレクトを宣言し、historyApiFallback.index を設定する必要があります。価値。


devServer: {
 historyApiFallback: true
}

Proxy

上記の方法を使用しても、ルーティング リクエストの応答例外が常に発生するため、問題を完全には解決できないことがわかりました。そのため、ブロガーはより良い解決策を探し続けました。ここでドキュメントをご覧ください

The proxy can be optionally bypassed based on the return from a function. The function can inspect the HTTP request, response, and any given proxy options. It must return either false or a URL path that will be served instead of continuing to proxy the request.

代理提供通过函数返回值响应请求方式,针对不同请求进行不同处理,函数参数接收HTTP请求和响应体,以及代理配置对象,这个函数必须返回false或URL路径,以表明如何继续处理请求,返回URL时,源请求将被代理到该URL路径请求。


proxy: {
 &#39;/&#39;: {
  target: &#39;https://api.example.com&#39;,
  secure: false,
  bypass: function(req, res, proxyOptions) {
   if (req.headers.accept.indexOf(&#39;html&#39;) !== -1) {
    console.log(&#39;Skipping proxy for browser request.&#39;);
    return &#39;/index.html&#39;;
   }
  }
 }
}

如上配置,可以监听https://api.example.com域下的/开头的请求(等效于所有请求),然后判断请求头中accept字段是否包含html,若包含,则代理请求至/index.html,随后将返回index.html文档至浏览器。

解决问题

综合以上方案,因为在webpack配置中修改了output.publicPath为/assets/,所以博主采用webpack-dev-server Proxy代理方式解决了问题:


const PUBLICPATH = &#39;/assets/&#39;
...
proxy: {
 &#39;/&#39;: {
  bypass: function (req, res, proxyOptions) {
   console.log(&#39;Skipping proxy for browser request.&#39;)
   return `${PUBLICPATH}/index.html`
  }
 }
}

监听所有前端路由,然后直接返回${PUBLICPATH}/index.html,PUBLICPATH就是设置的output.publicPath值。

另外,博主总是习惯性的声明,虽然不设置该属性也能满足预期访问效果:


historyApiFallback: true

相关推荐:

使用Django实现自定义404,500页面的方法

IDEA导入web项目详解(解决访问的404)

thinkphp制作404跳转页的简单实现方法

以上が反応ルーターのブラウザ履歴更新ページ 404 問題を解決する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
JavaScriptはCで書かれていますか?証拠を調べるJavaScriptはCで書かれていますか?証拠を調べるApr 25, 2025 am 12:15 AM

はい、JavaScriptのエンジンコアはCで記述されています。1)C言語は、JavaScriptエンジンの開発に適した効率的なパフォーマンスと基礎となる制御を提供します。 2)V8エンジンを例にとると、そのコアはCで記述され、Cの効率とオブジェクト指向の特性を組み合わせて書かれています。3)JavaScriptエンジンの作業原理には、解析、コンパイル、実行が含まれ、C言語はこれらのプロセスで重要な役割を果たします。

JavaScriptの役割:WebをインタラクティブでダイナミックにするJavaScriptの役割:WebをインタラクティブでダイナミックにするApr 24, 2025 am 12:12 AM

JavaScriptは、Webページのインタラクティブ性とダイナミズムを向上させるため、現代のWebサイトの中心にあります。 1)ページを更新せずにコンテンツを変更できます。2)Domapiを介してWebページを操作する、3)アニメーションやドラッグアンドドロップなどの複雑なインタラクティブ効果、4)ユーザーエクスペリエンスを改善するためのパフォーマンスとベストプラクティスを最適化します。

CおよびJavaScript:接続が説明しましたCおよびJavaScript:接続が説明しましたApr 23, 2025 am 12:07 AM

CおよびJavaScriptは、WebAssemblyを介して相互運用性を実現します。 1)CコードはWebAssemblyモジュールにコンパイルされ、JavaScript環境に導入され、コンピューティングパワーが強化されます。 2)ゲーム開発では、Cは物理エンジンとグラフィックスレンダリングを処理し、JavaScriptはゲームロジックとユーザーインターフェイスを担当します。

Webサイトからアプリまで:JavaScriptの多様なアプリケーションWebサイトからアプリまで:JavaScriptの多様なアプリケーションApr 22, 2025 am 12:02 AM

JavaScriptは、Webサイト、モバイルアプリケーション、デスクトップアプリケーション、サーバー側のプログラミングで広く使用されています。 1)Webサイト開発では、JavaScriptはHTMLおよびCSSと一緒にDOMを運用して、JQueryやReactなどのフレームワークをサポートします。 2)ReactNativeおよびIonicを通じて、JavaScriptはクロスプラットフォームモバイルアプリケーションを開発するために使用されます。 3)電子フレームワークにより、JavaScriptはデスクトップアプリケーションを構築できます。 4)node.jsを使用すると、JavaScriptがサーバー側で実行され、高い並行リクエストをサポートします。

Python vs. JavaScript:ユースケースとアプリケーションと比較されますPython vs. JavaScript:ユースケースとアプリケーションと比較されますApr 21, 2025 am 12:01 AM

Pythonはデータサイエンスと自動化により適していますが、JavaScriptはフロントエンドとフルスタックの開発により適しています。 1. Pythonは、データ処理とモデリングのためにNumpyやPandasなどのライブラリを使用して、データサイエンスと機械学習でうまく機能します。 2。Pythonは、自動化とスクリプトにおいて簡潔で効率的です。 3. JavaScriptはフロントエンド開発に不可欠であり、動的なWebページと単一ページアプリケーションの構築に使用されます。 4. JavaScriptは、node.jsを通じてバックエンド開発において役割を果たし、フルスタック開発をサポートします。

JavaScript通訳者とコンパイラにおけるC/Cの役割JavaScript通訳者とコンパイラにおけるC/Cの役割Apr 20, 2025 am 12:01 AM

CとCは、主に通訳者とJITコンパイラを実装するために使用されるJavaScriptエンジンで重要な役割を果たします。 1)cは、JavaScriptソースコードを解析し、抽象的な構文ツリーを生成するために使用されます。 2)Cは、Bytecodeの生成と実行を担当します。 3)Cは、JITコンパイラを実装し、実行時にホットスポットコードを最適化およびコンパイルし、JavaScriptの実行効率を大幅に改善します。

JavaScript in Action:実際の例とプロジェクトJavaScript in Action:実際の例とプロジェクトApr 19, 2025 am 12:13 AM

現実世界でのJavaScriptのアプリケーションには、フロントエンドとバックエンドの開発が含まれます。 1)DOM操作とイベント処理を含むTODOリストアプリケーションを構築して、フロントエンドアプリケーションを表示します。 2)node.jsを介してRestfulapiを構築し、バックエンドアプリケーションをデモンストレーションします。

JavaScriptとWeb:コア機能とユースケースJavaScriptとWeb:コア機能とユースケースApr 18, 2025 am 12:19 AM

Web開発におけるJavaScriptの主な用途には、クライアントの相互作用、フォーム検証、非同期通信が含まれます。 1)DOM操作による動的なコンテンツの更新とユーザーインタラクション。 2)ユーザーエクスペリエンスを改善するためにデータを提出する前に、クライアントの検証が実行されます。 3)サーバーとのリフレッシュレス通信は、AJAXテクノロジーを通じて達成されます。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール