当前位置: 首页 > news >正文

Vue/React 项目部署到服务器后,刷新页面出现404报错

问题描述:在本地启动项目一切正常,部署到服务器上线后出现BUG,项目刷新页面出现404

起初以为是自己路由守卫或是token丢失问题,找了一圈终于解决了

产生原因:我们打开vue/react打包后生成的dist文件夹,可以看到只有一个 index.html 文件及一些静态资源,这个是因为vue/react是单页应用(SPA),只有一个index.html作为入口文件,其它的路由都是通过JS来进行跳转的。
而网页上显示的是静态资源的绝对路径,虽然浏览器上的url变化了,但实际上服务器的静态资源是没有更改路径的,始终只有index.html这一个入口,所以刷新就会导致url上的路径和服务器上的资源不匹配,无法找到静态资源,从而报错404。(多页应用因为有多个入口文件,所以不会有这样的问题)

解决方案一:vue router 的 mode 改成hash

 export default new Router({
2     // mode: 'history',
3     mode: 'hash',
4     routes
5 })

解决方案二:配置nginx,将任意页面都重定向到 index.html

在服务器的nginx配置文件里,添加如下代码,再重启nginx,刷新网页即可

location / {try_files $uri $uri/ @rewrites;index index.html;
}location @rewrites {rewrite ^.*$ /index.html last;
}

扩展1: 为什么hash模式下没有刷新页面404 问题

hash路由的原理是onhashchange事件,hash模式下仅 hash符号之前的内容会被包含在http请求中,如www.xxx.com/#/login,hash的值为 #/login,hash值#/login虽然出现在 url中,但不会被包括在http请求中,其只会请求www.xxx.com,对服务端完全没有影响,因此改变hash不会重新加载页面,即使服务器nginx没有配置location,也不会返回404错误。

它的特点在于:hash 虽然出现在 URL 中,但不会被包括在 HTTP 请求中,对服务端完全没有影响,因此改变 hash 不会重新加载页面

而history模式:原理是利用了h5的Interface 中的pushState()方法和replaceState()方法,它们提供了对浏览器历史记录进行修改的功能,但当它们执行修改时,虽然改变了当前的 URL,但浏览器不会立即向服务器发送请求,因此history模式正常页面操作跳转路由,是不会再次发送http资源请求的。但是当刷新的时候,由于url已经改变,如www.xxx.com/login会完整地向服务器请求相关资源,所以就会造成对应路径的资源找不到,从而返回404。

但是使用hash路由,url上会携带#号标志,且history模式的同步更新浏览器历史记录功能就没有了。

扩展2:vue路由的两种模式 hash和history的区别

1. 直观区别:

    hash模式url带 # 号,history模式不带 # 号。

2. 深层区别: 

  • hash模式url里面永远带着#号,我们在开发当中默认使用这个模式。
  • 如果用户考虑url的规范那么就需要使用history模式,因为history模式没有#号,是个正常的url适合推广宣传。功能也有区别,比如我们在开发app的时候有分享页面,那么这个分享出去的页面就是用vue或是react做的,再把这个页面分享到第三方的app里,有的app里面url是不允许带有#号的,所以要将#号去除那么就要使用history模式
  • 但是使用history模式还有一个问题就是,在访问二级页面的时候,做刷新操作会出现404错误,那么就需要使用上述的方法或者和后端配合让他配置一下apache或是nginx的url重定向,重定向到你的首页路由上就ok啦。

http://www.lryc.cn/news/149214.html

相关文章:

  • 通信笔记:RSRP、RSRQ、RSNNR
  • 前端:html实现页面切换、顶部标签栏(可删、可切换,点击左侧超链接出现标签栏)
  • python print格式化输出
  • 钢筋水泥中的信仰--爱摸鱼的美工(16)
  • ViT论文Pytorch代码解读
  • Harbor查看密码
  • Boa服务器与Cgi简介
  • 入门vue——创建vue脚手架项目 以及 用tomcat和nginx分别部署vue项目(vue2)
  • oracle中的(+)
  • 五种永久免费 内网穿透傻瓜式使用
  • 【Java基础增强】Stream流
  • reduxreact-redux
  • go中的并发
  • 开启EMQX的SSL模式及SSL证书生成流程
  • 4 | Java Spark实现 WordCount
  • Redis7安装
  • Nginx vs Tomcat:一个高性能Web服务器和Java应用服务器的对决
  • 终端登录github两种方式
  • 【防火墙】防火墙NAT Server的配置
  • 《算法竞赛·快冲300题》每日一题:“简化农场”
  • 【二等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「冀科数字」解题思路
  • C# List与HashSet的contains()方法查询速度比较
  • 命令执行漏洞复现攻击:识别威胁并加强安全
  • Keepalived实现服务器的高可用性
  • Python程序化交易接口批量获取数据源码
  • 【强化学习】基本概念
  • 0001__安装electron失败 postinstall: `node install.js`
  • Linux测开常用命令总结
  • xml转化为txt数据的脚本,为yolo提供训练
  • 【H5页面嵌入到小程序或APP中实现手机号点击复制和拨号功能】