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

news/2025/2/2 7:03:12/

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.htmindex  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.ppmy.cn/news/56218.html

相关文章

Python+vue企业员工高校学生体检服务预约系统PyCharm+django

开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 数据库工具:Navicat 开发软件:PyCharm 功能介绍 通过软件的需求分析已经获得了系统的基本功能需求,根据需求&#xff0c…

【五一创作】【数学建模】matlab的常用函数运用(1)

文章目录 1. matlab基本常识2. 常用输入输出函数2.1 输出函数2.2 拼接函数(字符串的合并)2.3 输入函数 3. 求和函数3.1 向量求和3.2 矩阵求和 4. 提取矩阵元素4.1 取第x行第y列的元素4.2 取指定行或列的所有元素4.3 取指定某些行的所有元素 1. matlab基本…

Win10电脑开机蓝屏多次重启无效怎么办?

Win10电脑开机蓝屏多次重启无效怎么办?有用户在使用电脑的时候遇到了系统蓝屏的问题,想要通过重新启动的方式来解决问题,但是多次重新启动电脑都还是遇到蓝屏的问题。那么这个情况要怎么去进行解决呢?来看看以下的处理方法吧。 准…

java 自定义Annotation注解

目录 1.声明注解 注解声明为interface(注:这与interface接口没有任何关系) 内部定义成员通常用value表示 使用 可以指定成员的默认值,使用default定义 介绍 2.JDK中的元注解 Retention: Target: …

jQuery入门 -- 概述和基本使用

1. jQuery概述 jQuery的概念:jQuery是一个快速、简洁的JavaScript库,其设计的宗旨是“write Less,Do More”,即提倡写更少的代码,做更多的事情。 j就是JavaScript; Query查询;意思就是查询js,把js中的DOM…

【文件系统】

目录 1 inode 2 软链接 3 硬链接 1 inode 当我们创建一个文件时,用带上 -i 选项可以查看文件的inode: 其中第一个选项就是文件的inode,除此之外另外几列表示的是: 模式 硬链接数 文件所有者 所属组 大小 最后修改时间文件名 ls -l读取存储在磁盘上的文…

【OpenFOAM】-算例解析合集

【OpenFOAM】-算例解析合集 OlaFlowinterFoampimpleFoamOlaFlow 【OpenFOAM】-olaFlow-算例1- baseWaveFlume 【OpenFOAM】-olaFlow-算例2- breakwater 【OpenFOAM】-olaFlow-算例3- currentWaveFlume 【OpenFOAM】-olaFlow-算例4- irreg45degTank 【OpenFOAM】-olaFlow-算例5…

Java Memory Model

JMM(Java Memory Model)是什么?: JMM是一份规范,它规定了 JVM 在多线程并发访问共享内存中的数据时,线程的行为规范和模型。 JMM 规定了所有的变量都存储在主内存中,每个线程都有自己的工作内存…