vue/react项目刷新页面出现404的原因以及解决办法

news/2024/7/15 18:23:46 标签: vue.js, react.js, 前端

vue/react项目刷新页面出现404的原因以及解决办法

    • 背景
    • 解决办法
    • 文章参考

背景

  1. 问题描述:vue/react项目,正常的页面操作跳转,不会出现404的问题,但是一旦刷新,就会出现404报错。

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

  3. 接下来我们看看服务器上的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. 法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. 法2:在服务器nginx配置文件里,添加如下代码,再重启nginx,刷新网页就OK了

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

文章参考

https://www.cnblogs.com/echohye/p/16566706.html
https://www.jb51.net/article/256217.htm
https://www.cnblogs.com/ling-yu-amen/p/11533726.html


http://www.niftyadmin.cn/n/272961.html

相关文章

通达信顾比倒数线指标公式,信号不漂移

顾比倒数线是由技术派大师戴若顾比发明的,该指标利用三个重要的价格来判断入场或离场时机,可用于盘后制定下一个交易日的操作计划。此外,顾比倒数线还可以用于补充验证其他指标。 在编写顾比倒数线选股公式之前,需要先了解顾比倒…

clickhouse 为什么快?

文章目录 [TOC](文章目录) 前言一、什么是列式数据库?为什么要用列式数据库,优点是什么? 二、clickhouse入门1. 个人猜想2. 使用clickhouse引入依赖yml配置扫描mapper 2.生成相应代码,执行测试用例查询结果 总结 前言 例如:随着人工智能的不断发展&…

CF 1823B B. Sort with Step

CF 1823B B. Sort with Step Problem - B - Codeforces 题意: 给n长的数组,里边只有1-n的数字,问你能不能在k步长的交换内换成升序的1-n AC代码: 首先给你1-n的数字还要排成增序; 对于3 4 1 2 3在第1个数&#…

设计模式 -- 原型模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【测试开发】突破瓶颈必学技能——什么是k8s的核心概念?

目录 Docker 和K8s k8s中的重要概念 Master 节点 Node 节点 集群(Cluster) 标签(Label) 命名空间(Namespace) 容器组(Pod) 无状态部署(Deployment)…

Java为什么卷?好找工作吗?

今年都不是太好找工作吧 我说我好找你们信吗 我把这个结论呢放到最后 同时 这个今天我把我所有的毕生所学 全部分享给你们 希望对大家有所帮助 如果你未来觉得在这个一线城市呢 拿个2万块钱以下的工作 如果你觉得就可以了 那么我觉得咱们这篇文章呢 今天可能不太合适 我觉得你就…

Java设计模式:工厂模式,优化代码的灵活性和可维护性

Java设计模式:工厂模式,优化代码的灵活性和可维护性 Java设计模式之工厂模式什么是工厂模式?工厂模式的使用总结 Java设计模式之工厂模式 作为一名初级程序员,当你开始接触设计模式的时候,你可能会觉得这些概念很抽象…

【Celery】任务Failure或一直超时Pending

编写背景 task进入队列后,部分任务出现Failure或者一直Pending,且业务代码没有报错。 运行环境 celery配置 from celery import Celery broker redis://:127.0.0.1:6379/1 backend redis://:127.0.0.1:6379/2 app Celery(brokerbroker,backendbackend,includ…