首页 > 其他分享 >vue项目部署后刷新页面404的原因和解决方案

vue项目部署后刷新页面404的原因和解决方案

时间:2024-05-31 16:35:07浏览次数:22  
标签:index vue hash 404 服务器 history 路由 页面

在部署 Vue.js 单页面应用(SPA)时,遇到刷新页面时返回 404 错误是一个常见问题。这个问题通常是由于服务器不知道如何处理 SPA 的路由而导致的。

原因

在 Vue.js SPA 中,前端路由由 Vue Router 处理。当你在应用中导航时,Vue Router 可以处理这些路由并加载相应的组件。但是,当你直接刷新浏览器或访问一个特定的 URL 时,浏览器会向服务器发出请求,而服务器可能不知道如何处理这些客户端路由,导致返回 404 错误。

先来了解下vue路由两种模式的区别。

const router = createRouter({
  history: createWebHistory(), // createWebHashHistory URL带#,createWebHistory URL不带#
  routes: constantRoutes
});

1.hash 模式(默认)的访问URL中有 # 字符,history模式的URL没有带#,外观上history模式比hash模式好看些;

2.hash模式通过监听浏览器的onhashchange()事件变化,查找对应的路由规则;history模式是利用h5的history中新增的两个API pushState() 和 replaceState() 和一个事件onpopstate监听其URL变化;

3.hash模式能兼容到IE8,history模式 只能兼容到 IE10;

4.由于 hash 值变化不会导致浏览器向服务器发出请求,而且 hash 改变会触发 hashchange 事件(hashchange只能改变 # 后面的url片段);虽然hash路径出现在URL中,但是不会出现在HTTP请求中,对服务器完全没有影响,因此改变hash值不会重新加载页面,基本都是使用 hash 来实现前端路由的。

重点:hash模式在每次刷新页面时是直接更改“#”后的路径,history模式每次刷新会重新像服务器重新请求资源,但是服务器会把vue的路由地址当成文件路径访问(如: /pages/index),服务器又没有这个文件路径,且服务端没有配置相应的路由重定向,就会访问404,也就是本文开头提到的问题;history模式的好处是可以进行修改历史记录,并且不会立刻像后端发起请求。不过如果对于项目没有硬性标准要求,我们可以直接使用hash模式开发。

解决方案

为了处理这个问题,你需要配置服务器,使其在遇到 404 错误时始终返回 index.html 文件。这样 Vue Router 就可以接管并处理所有路由。

以下是针对不同服务器的解决方案:

1. 使用 Nginx

在 Nginx 中,可以通过修改配置文件来实现这一点。打开 Nginx 配置文件(通常是 /etc/nginx/nginx.conf/etc/nginx/sites-available/default),并添加如下配置:

server {
    listen 80;
    server_name your_domain_or_ip;

    root /path/to/your/dist;
    index index.html;

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

    # 其他配置...
}

2. 使用 Apache

在 Apache 中,可以使用 .htaccess 文件来实现这一点。创建或编辑 .htaccess 文件(位于项目的根目录),并添加如下配置:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

3. 使用 Express.js

如果使用 Node.js 和 Express.js 作为服务器,可以在服务器代码中添加一个 catch-all 路由来处理所有未匹配的请求:

const express = require('express');
const path = require('path');
const app = express();

const port = process.env.PORT || 3000;

app.use(express.static(path.join(__dirname, 'dist')));

app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'dist', 'index.html'));
});

app.listen(port, () => {
  console.log(`Server is running on port ${port}`);
});

总结

无论使用什么服务器,解决方案的核心是确保所有未匹配的请求都返回 index.html,以便 Vue Router 可以处理客户端路由。这将确保在刷新页面时,不会出现 404 错误,并且应用可以正常加载。

vue项目部署后刷新页面404的原因和解决方案

标签:index,vue,hash,404,服务器,history,路由,页面
From: https://www.cnblogs.com/echohye/p/18224794

相关文章

  • 从0到1写一个vue2官网项目(一)
    1、安装npm9.5.1和node18.16.0(略)2、sudonpminstall-g@vue/cli 选vue23、pnpmi然后pnpmrunserve4、跑vue项目如果报错: ERROR Failedtocompilewith2errors                                           17:33......
  • Vue 3 + TypeScript:构建强大前端应用的完美组合
    在前端开发的领域中,Vue3和TypeScript的结合正成为一种强大且流行的技术栈。今天,让我们深入探讨Vue3+TypeScript所带来的诸多优势和实践经验。一、Vue3的卓越特性Vue3引入了众多令人瞩目的新特性,如更好的性能、更灵活的组合式API等。这些特性使得我们能够以......
  • Vue devDependencies 与 dependencies 能别
    VuedevDependencies与dependencies能别,如何往项目的node_modules安装组件概述devDependencies用于本地环境开发只会在开发环境下依赖的模块,生产环境不会被打入包内(通过NODE_ENV=developement或NODE_ENV=production指定开发还是生产环境)dependencies用户发布环境......
  • vue3毫秒级时间戳转换
    Unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。以下2个方法源自于时间工具包:timeutils效果展示:在线时间戳转换工具时间转时间戳/***将某个时间转化成时间戳*时间格式:2019-05-2000:00:00或2019年5月1日00:00:00*返回值:1556640000000,13......
  • 小程序webView 实现小程序内嵌H5页面
    web-view|微信开放文档本案例新建了一个 webView页面 只渲染webView组件配置路由,跳转页面的时候 前缀使用‘/subPages/webView/index?weburl=https://xxxxx’componentDidMount 的时候 获取路由中的 weburl 地址参数asynccomponentDidMount(){co......
  • vue3 vite 脚手架生成项目 prettier 自动格式化失败 vscode插件 Vue - Official 解决
    vue3vite脚手架生成项目prettier自动格式化失败vscode插件Vue-Official解决方案问题以前写的都是vue2的项目,自动格式化都用的vetur,都设置好了。现在新弄了个vue3的项目,脚手架起的vitevue3,搞个代码格式化,发现prettier没好事。解决思路格式化一共俩工具eslintpret......
  • 265:vue+openlayers 一次性清除所有控件(亲测好用)
    作者:还是大剑师兰特,曾为美国某知名大学计算机专业研究生,现为GIS领域高级前端工程师;CSDN知名博主,深耕openlayers、leaflet、mapbox、cesium,canvas,echarts等技术开发,欢迎加微信(gis-dajianshi),一起交流。查看本专栏目录-本文是第265个示例文章目录一、示......
  • vue 导出xlsx (报错./cptable in ./node modules/xlsx-style/dist/cpexcel.js)
    安装 xlsx 和  xlsx-stylesrc下创建文件夹utils, utils文件夹下创建index.js文件,index.js文件内容如下:*CreatedbyAnqion16/11/18.*//***Parsethetimetostring*@param{(Object|string|number)}time*@param{string}cFormat*@returns{stri......
  • VUE卖座网
      免费获取方式↓↓↓   项目介绍033:项目名:卖座网技术栈:VUE网址:http://localhost:8080/功能(前端数据都为静态假数据,仅展示,实现动态需自行搭建后端)电影正在上映即将上映影院全城app订票最近去过资讯我的 二、技术栈 所有场景都支持适合零基础小......
  • vue小白商城
      免费获取方式↓↓↓   项目介绍034:npminstallnpmrunservenpmrunbuild主要功能小白商城首页我的消息收藏夹购物车卖家中心联乐客服关于我们 二、技术栈 所有场景都支持适合零基础小白练手和实战;适合二次开发;项目图片概览:以上是对本项目的界面......