广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何解决react-router browserHistory刷新页面404问题
  • 381
分享到

如何解决react-router browserHistory刷新页面404问题

2024-04-02 19:04:59 381人浏览 八月长安
摘要

这篇文章主要介绍如何解决React-router browserHistory刷新页面404问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景使用webpack-dev-serv

这篇文章主要介绍如何解决React-router browserHistory刷新页面404问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

背景

使用webpack-dev-server做本地开发服务器时,正常情况只需要简单使用WEBpack-dev-server指令启动即可,但是当项目处于以下两种情况时,往往需要有嵌套路由和异步加载路由:

  1. 我们使用react-router这种路由库构建单页面应用路由;

  2. 使用html-webpack-plugin插件动态将加载js的<script>标签注入html文档;

这时,访问localhost:9090是可以正常加载页面和js等文件的,但是当我们需要访问二级甚至三级路由或者刷新页面时,如localhost:9090/posts/92时,可能会出现两种情况:

  1. 页面加载失败,返回Cannot Get(404);

  2. 服务响应,但是没有返回webpack处理输出的html文件,导致无法加载js资源,第二种情况如图:

如何解决react-router browserHistory刷新页面404问题

那么我们怎么处理才能正常访问,各页面路由呢?博主追踪溯源,查找文档配置后解决了问题,本篇就是对整个解决问题过程的总结

分析问题

发现问题后,我们就要开始分析,解决问题了,我们判断这个问题一般是两方面原因造成:

  1. react-router路前端由配置;

  2. webpack-dev-server服务配置;

react-router

因为前端路由更容易确定问题,更方便分析,而且对于react-router更熟悉,所以首先去查询react-router路由库相关配置信息,发现文档中提到了使用browserHistory时,会创建真实的URL,处理初始/请求没有问题,但是对于跳转路由后,刷新页面或者直接访问该URL时,会发现无法正确相应,更多信息查看参考文档,文档中也提供了几种服务器配置解决方式:

node

const express = require('express')
const path = require('path')
const port = process.env.PORT || 8080
const app = express()

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

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

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

在使用Node作为服务时,需要使用通配符*监听所有请求,返回目标html文档(引用js资源的html)。

Nginx

如果使用的是Nginx服务器,则只需要使用try_files 指令:

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

Apache

如果使用Apache服务器,则需要在项目根目录创建.htaccess文件,文件包含如下内容:

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

以下都是针对服务器的配置,可惜的是我们目前还没引入相关服务器,只是使用了webpack-dev-server的内置服务,但是我们已经找到问题所在了,就是路由请求无法匹配返回html文档,所以接下来就该去webpack-dev-server文档中查找解决方式了。

webpack-dev-server

在这里不得不吐槽一下webpack-dev-server官方文档,博主反复看了几遍,才看清楚了问题所在,这里也分两种情况:

  1. 没有修改output.publicPath,即webpack配置文件中没有声明值,属于默认情况;

  2. 设置了output.publicPath为自定义值;

点此查看文档

默认情况

默认情况下,没有修改output.publicPath值,只需要设置webpack-dev-server的historyapiFallback配置:

devServer: {
 historyApiFallback: true
}

If you are using the HTML5 history API you probably need to serve your index.html in place of 404 responses, which can be done by setting historyApiFallback: true

如果你的应用使用HTML5 history API,你可能需要使用index.html响应404或者问题请求,只需要设置g historyApiFallback: true即可

自定义值

However, if you have modified output.publicPath in your Webpack configuration, you need to specify the URL to redirect to. This is done using the historyApiFallback.index option

如果你在webpack配置文件中修改了 output.publicPath 值,那么你就需要声明请求重定向,配置historyApiFallback.index 值。

// output.publicPath: '/assets/'
historyApiFallback: {
 index: '/assets/'
}

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: {
 '/': {
  target: 'https://api.example.com',
  secure: false,
  bypass: function(req, res, proxyOptions) {
   if (req.headers.accept.indexOf('html') !== -1) {
    console.log('Skipping proxy for browser request.');
    return '/index.html';
   }
  }
 }
}

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

解决问题

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

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

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

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

historyApiFallback: true

以上是“如何解决react-router browserHistory刷新页面404问题”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网VUE频道!

--结束END--

本文标题: 如何解决react-router browserHistory刷新页面404问题

本文链接: https://www.lsjlt.com/news/69184.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何解决react-router browserHistory刷新页面404问题
    这篇文章主要介绍如何解决react-router browserHistory刷新页面404问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!背景使用webpack-dev-serv...
    99+
    2022-10-19
  • 如何解决React使用browserHistory项目访问404的问题
    这篇文章主要介绍了如何解决React使用browserHistory项目访问404的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。最近项...
    99+
    2022-10-19
  • 前端部署nginx刷新后404,解决Nginx刷新页面后404的问题
    问题描述: 使用Nginx部署后,登录页面刷新一下就出来404,如下图: 刷新以后 ,页面变成404 Not Found 解决方案: 查看了一下nginx配置,出现问题的配置是这样的: server { liste...
    99+
    2023-09-10
    前端 服务器 运维
  • 如何解决vue router使用history模式刷新后404问题
    这篇文章将为大家详细讲解有关如何解决vue router使用history模式刷新后404问题,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。因为我们的应用是单页客户端应用...
    99+
    2022-10-19
  • Nginx解决history模式下页面刷新404问题示例
    目录前置知识Nginxlocation常用匹配规则root 与 alias解决刷新后出现404的问题总结前置知识 单页应用(SPA - single page application...
    99+
    2022-11-13
  • nginx部署react刷新404如何解决
    今天小编给大家分享一下nginx部署react刷新404如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。nginx部署...
    99+
    2023-07-04
  • Vue项目服务器部署刷新页面404问题及解决
    目录Vue服务器部署刷新页面404问题描述原因解决方法vue项目刷新界面出现404,正常点击跳转没问题Vue服务器部署刷新页面404 问题描述 在上线vue开发的前端网页部署在服务器...
    99+
    2022-11-13
  • react刷新找不到页面如何解决
    这篇文章主要讲解了“react刷新找不到页面如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“react刷新找不到页面如何解决”吧!react刷新找不到页面的解决办法:1、找到并打开“a...
    99+
    2023-07-04
  • react路由页面不刷新如何解决
    这篇文章主要介绍“react路由页面不刷新如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“react路由页面不刷新如何解决”文章能帮助大家解决问题。react路由页面不刷新的解决办法:1、在“...
    99+
    2023-07-04
  • 如何解决angular2中router路由跳转navigate的使用与刷新页面问题
    这篇文章主要介绍如何解决angular2中router路由跳转navigate的使用与刷新页面问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、router.navigate的使...
    99+
    2022-10-19
  • 如何解决vue this.$forceUpdate() 处理页面刷新问题
    这篇文章主要为大家展示了“如何解决vue this.$forceUpdate() 处理页面刷新问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决vue ...
    99+
    2022-10-19
  • Ajax回退刷新页面问题怎么解决
    本篇内容介绍了“Ajax回退刷新页面问题怎么解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Ajax 简...
    99+
    2022-10-19
  • 如何解决vue打包项目后刷新404的问题
    这篇文章主要介绍了如何解决vue打包项目后刷新404的问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。vue打包项目后刷新404的问题Ng...
    99+
    2022-10-19
  • Vue3页面局部刷新组件的刷新问题怎么解决
    步入正题,解决今天的问题代码首先我们要对app.vue进行修改代码:<template> <div id="app"> <nav-View v-show="login&...
    99+
    2023-05-17
    Vue3
  • vue-router中重定向不刷新问题如何解决
    这期内容当中小编将会给大家带来有关vue-router中重定向不刷新问题如何解决,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。前阵子太忙了,自己一个人一边开发着新项目,一...
    99+
    2022-10-19
  • 单页面Vue页面刷新出现闪烁问题及解决
    目录分析原因: 为什么刷新会出现闪烁的问题解决方法: 使用 v-cloak 用法关于Vue刷新页面问题如何解决 provide / inject 组合分析原因: 为什么刷新...
    99+
    2022-11-13
  • 如何解决页面刷新vuex数据消失的问题
    这篇文章主要为大家展示了“如何解决页面刷新vuex数据消失的问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何解决页面刷新vuex数据消失的问题”这篇文章吧...
    99+
    2022-10-19
  • react改变数组页面没有刷新如何解决
    本篇内容主要讲解“react改变数组页面没有刷新如何解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“react改变数组页面没有刷新如何解决”吧!react改变数组页面没有刷新是因为数组的赋值是...
    99+
    2023-07-05
  • react页面传值刷新后值消失如何解决
    今天小编给大家分享一下react页面传值刷新后值消失如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。react页面传值...
    99+
    2023-07-04
  • Vueenter回车导致页面刷新问题及解决
    目录Vue enter回车导致页面刷新解决方法Vue按下enter默认刷新页面bugVue enter回车导致页面刷新 分页中需要 输入页码进行跳转,但是却出现 跳到指定页面后,页面...
    99+
    2022-11-13
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作