首页 > 其他分享 >vue或react项目上线刷新出现404的原因以及解决办法

vue或react项目上线刷新出现404的原因以及解决办法

时间:2024-03-22 17:35:12浏览次数:22  
标签:index vue hash html react nginx 404 路由

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

接下来我们看看服务器上的nginx配置:
————————————————

server {
  // 监听80端口
  listen 80;
  // 定义你的站点名称
  server_name website.com;
  // 根据请求 URI 设置配置
  location / {
      // 站点根目录,这里为 vue 构建出来的 dist 目录
      root   /www/dist;
      // 站点初始页为index.html 或 index.htm
      index  index.html index.htm;
  }
}

根据nginx配置我们可以得出,当我们在地址栏输入域名(如www.xxx.com)时,这时会打开我们 dist 目录下的 index.html 文件,然后我们再通过页面操作跳转路由进入到 www.xxx.com/login,关键在这里,当我们在 www.xxx.com/login 页执行刷新操作,nginx location 是没有相关配置的,所以就会出现 404 的情况。

解决办法

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

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

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

方法2:配置nginx,将任意页面都重定向到 index.html,把路由交给前端代码去处理
产生问题的本质是因为我们的路由是通过JS来执行视图切换的,当我们进入到子路由时刷新页面,web容器没有相对应的页面此时会出现404,所以我们只需要配置nginx,将任意页面都重定向到 index.html,把路由交给前端代码去处理(即先进入到index.html,再通过js对url进行路由分发和页面渲染)。
在服务器nginx配置文件里,添加如下代码,再重启nginx,刷新网页就OK了。
————————————————

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

 

原文链接:https://blog.csdn.net/weixin_42299708/article/details/132055098

标签:index,vue,hash,html,react,nginx,404,路由
From: https://www.cnblogs.com/zhangzhijian/p/18090133

相关文章

  • vue2.0是如何监听双向绑定的?
    <!DOCTYPEhtml><html><head><metacharset="utf-8"/><title></title><style>.contanier{width:300px;height:300px;......
  • Vue学习笔记57--vue默认插槽 +
    vue默认插槽示例一:不使用插槽Category.vue<template><divclass="category"><h3>{{title}}</h3><ul><liv-for="(item,index)inlistData":key="index">{{item}}</li>......
  • Ant Design Vue 修改表格头部样式
    在网上搜了好多修改表格头部样式的,最后自己摸索出来,分享给大家,最后附上完整代码。首先用到的是customHeaderRow这个API,类型是一个函数1.HTML部分<a-tablesize='small'//样式大小:columns="columns":data-source="data"bordered:pagination="false"//不显示页数:c......
  • Vue 中给 data 中的对象属性添加一个新的属性时会发生什么?如何解决?
    <template><div><ul><liv-for="valueinobj":key="value">{{value}}</li></ul><button@click="addObjB">添加obj.b</button></div>&......
  • Vue中会出现哪些跨域问题?如何解决
    跨域跨域指的是在网络通信中,由于安全策略的限制,浏览器的一个文档或者脚本试图去请求另一个源(域名、协议或端口)下的资源时,会受到限制或阻止。这种情况通常发生在网页上的JavaScript发起跨域请求时。跨域请求可能会导致安全漏洞,因此浏览器通常会执行同源策略(Same-OriginPolicy),阻......
  • ruoyi-nbcio-plus基于vue3的flowable增加开始节点的表单绑定修改
    更多ruoyi-nbcio功能请看演示系统gitee源代码地址前后端代码:https://gitee.com/nbacheng/ruoyi-nbcio演示地址:RuoYi-Nbcio后台管理系统http://122.227.135.243:9666/更多nbcio-boot功能请看演示系统 gitee源代码地址后端代码:https://gitee.com/nbacheng/nbcio-boot......
  • vue3 + ts +element-plus + vue-router + scss + axios搭建项目
    本地环境:node版本:20.10.0目录一、搭建环境二、创建项目三、修改页面四、封装路由vue-router五、element-plus六、安装scss七、封装axios一、搭建环境1、安装vue脚手架npmi-g@vue/cli2、查看脚手架版本vue-V3、切换路径到需要创建项目的地方二、创建......
  • 基于springboot+vue的乡村民宿管理系统
    一、系统架构        前端:vue|element-ui        后端:springboot|mybatis-plus        环境:jdk1.8+|mysql|maven|nodejs二、代码及数据库        三、功能介绍   01.登录页  02.注册 03.管理员-首页 ......
  • jeecgBoot-vue3记录各个位置
    侧边栏顶部logo处(包含logo和title)src/conmponents/Application/srv/AppLogo.vue侧边栏(有无下级)src/compoents/SimpleMenu/src/SimpleSubMenu侧边栏(可设置背景图片)src/layoits/default/sider/LayoutSider侧边栏src/layouts/default/index.vue头部欢迎语是......
  • Vue学习笔记56--vue常用Ajax库(axios)
    vue常用Ajax库:1.vue-resource插件库npmivue-resource使用方式略,不建议使用,vue1.x使用广泛,官方已不维护2.axios通用的Ajax请求库,官方推荐,使用广泛axios在Vue项目中可以用来向后台发送请求(调接口API),获取响应信息的一个方法。Axios 是一个基于 promise 的 HTTP 库,可以......