Nginx 部署 Vue.js 应用时的 404 错误解决经历

Nginx 部署 Vue.js 应用时的 404 错误解决经历

在我最近的一个项目中,我遇到了一个让我抓狂的问题:使用 Nginx 部署的 Vue.js 应用,在访问某些路由时,刷新页面竟然出现了 404 错误。查找半天后,最终找到了解决方案。。。

问题分析

在使用 Vue Router 的单页应用中,一切正常,但是当我在浏览器中直接刷新页面,比如访问 https://chat.test.website/contact_groups,Nginx 就开始发愁了。它试图查找与 URL 对应的静态文件,但无论如何都找不到,于是返回了一个 404 错误。

解决方案

我开始查找如何配置 Nginx 来处理这种情况,经过一番搜索,终于找到了答案。以下是我所使用的 Nginx 配置:

Nginx 配置示例

chat.test.website的Nginx 配置文件的server块下,添加如下内容:

    location ~* \.(ico|svg)$ {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null;
    }
    
    location / {
    	add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
        expires -1; # 禁用缓存
        root /www/wwwroot/chat.test.website/public_html; # 修改为你的构建输出目录
        index index.html;
        try_files $uri $uri/ /index.html; # 处理 Vue Router 的重定向
    }

配置说明

try_files $uri $uri/ /index.html; 是关键!这个指令告诉 Nginx,首先尝试查找请求的文件,如果找不到,就转发到 index.html,这样 Vue Router 就可以接管路由了!

我还禁用了 HTML 文件的缓存,以确保用户每次访问都能获取到最新的内容。

对于其他静态资源,也配置了合理的缓存策略,这样可以加快页面加载速度。

应用配置

在修改配置后,需要重启 Nginx 以使其生效。使用以下命令:

sudo nginx -s reload

部署后,如何让用户刷新缓存

yarn build后,部署到服务器,如何让客户端强制刷新js等缓存呢?可以采用文件名版本控制的方式,

在 Vue 2 项目中,可以通过配置 Webpack 来实现文件名版本控制。以下是步骤:

  1. 修改 vue.config.js: 在项目根目录下创建或修改 vue.config.js 文件,添加 filenameHashing 配置。
// vue.config.js
module.exports = {
  filenameHashing: true,
  chainWebpack: config => {
    config.output.filename = '[name].[contenthash].js'; // 设置 JS 文件名
    config.output.chunkFilename = '[name].[contenthash].js'; // 设置 chunk 文件名
  }
};
  1. 构建项目: 运行 yarn buildnpm run build,生成的构建文件将会包含哈希值的文件名。

  2. 检查构建输出: 构建后,在 dist 文件夹中查看生成的文件名,确保它们包含了哈希值,如 app.abc123.js

这样配置后,每次构建时,如果文件内容发生变化,生成的文件名也会相应变化,从而帮助浏览器获取最新版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值