Nginx下刷新VUE页面出现404原因

本文分析了在Nginx下,Vue项目刷新页面出现404错误的原因,指出当Nginx匹配不到静态资源时会返回404。Vue Router的history模式在刷新时因未向后端发送请求而避免404。解决方案是通过Nginx的try_files指令,确保所有请求重定向到index.html,从而顺利运行Vue应用。

Nginx下刷新VUE页面出现404原因

我们知道nginx主要通过http核心模块中的location来匹配浏览器发出URL来进行资源匹配,匹配成功了就返回结果。

下面是一个简单的nginx配置:

server {
    listen       8080;
    server_name  localhost;

    location / {
        root   d:/nginx/demo/;  # 资源查找目录,去那个文件夹去找静态资源
        index  index.html index.htm;  # 首页
    }
}

# 这个配置的意思很简单就是当我们在浏览器访问http://localhost:8080的时候,默认首页是index.html,去目录d:/nginx/demo/寻找资源

我们看下d:/nginx/demo/下面有什么资源:

资源

我们分别访问下面的地址的结果:

  • http://localhost:8080/ 能正常访问,默认显示index.html页面
  • http://localhost:8080/demo.html 能正常访问
  • http://localhost:8080/demo2.html 不能正常访问
  • http://localhost:8080/demo.png 能正常访问,返回404
  • http://localhost:8080/demo2.png 不能正常访问,返回404

通过上面我们得出一个结论就是nginx请求的静态资源如果匹配不到就显示404。

我们在来看下我们用vue run build构建的文件结构:

vue构建的文件结构

上面这个项目是用官方的vue-cli创建的一个demo构建的,我们发现构建的项目中根本没有路由配置中的请求资源文件,css里面是样式文件,js里面是js文件,所以我们刷新浏览器请求资源的时候会404,因为nginx匹配不到对应的资源文件名称。

注意:这里刷新首页是不会404的,因为上图的目录中有一个index.html的页面资源。

前端路由vue router的history和hash模式

我们发现404只出现在刷新的时候,直接通过点击路由地址是不会出现404的,这是为什么呢?

因为VUE的 Vue-Router为我们提供了history和hash模式,这种模式的作用就是-----改变页面的时候不会向后端发出请求

因为不会像后端nginx发送请求,所以就不会出现404这种情况。

hash 模式和 history 模式都属于浏览器自身的特性。Vue-Router 只是利用了这两个特性(通过调用浏览器提供的接口)来实现前端路由。

怎么解决----利用Nginx提供的try_files配置来解决

其实方法很简单,我们知道既然后端提供了一个index.html页面,而前端路由的实现是通过vue-router来实现的,我们就可以每次请求资源你的时候直接请求到index.html上面即可,这里需要用到nginx的一个功能配置try_files。

try_files:

比如按照下面的配置请求http://localhost:8080/vue-demo,会依次请求:

  1. 文件d:/nginx/demo/vue-demo
  2. 文件d:/nginx/demo/vue-demo/下的index文件
  3. 请求http://localhost:8080/index.html
server {
    listen       8080;
    server_name  localhost;

    location / {
        root   d:/nginx/demo/;  # 资源查找目录,去那个文件夹去找静态资源
        index  index.html index.htm;  # 首页
        try_files $uri $uri/ /index.html
    }
}
### 3.1 Vue 项目部署到 Nginx 页面刷新 404 错误的原因Vue 项目使用 `vue-router` 的 `history` 模式时,URL 中不再包含 `#` 符号,这使得 URL 更加美观。然而,这种模式在部署到 Nginx 后,刷新页面时会出现 404 错误。其根本原因是 `history` 模式下的路由路径并不是服务器上的真实文件路径,Nginx 在接收到请求时会尝试查找对应的静态文件,但由于这些路径并不存在,因此返回 404 错误 [^2]。 ### 3.2 解决方案一:配置 Nginx 重写规则 在 Nginx 配置文件中,可以通过 `try_files` 指令将所有请求重定向到 `index.html`,由 Vue 路由器处理具体的路由逻辑。该配置确保即使刷新页面,请求也会被正确地引导至前端路由进行处理 [^1]。 ```nginx location / { try_files $uri $uri/ /index.html; } ``` 如果 Vue 项目部署在子路径下(如 `/frontend`),需要对子路径进行特别配置,确保 `try_files` 指向正确的 `index.html` 文件 [^3]。 ```nginx location /frontend { index index.html index.htm; try_files $uri $uri/ /frontend/index.html; } ``` ### 3.3 解决方案二:使用 `rewrite` 规则 另一种方法是通过 `rewrite` 指令将所有不存在的文件请求重写到 `index.html`。该方法适用于更复杂的 URL 结构,确保即使路径中包含参数,也能被正确地重定向到前端路由 [^5]。 ```nginx if (!-e $request_filename) { rewrite ^(.*)$ /index.html?s=$1 last; break; } ``` ### 3.4 解决方案三:使用 `location @router` 自定义路径处理 在某些情况下,可能需要更精细地控制请求的处理方式。可以通过定义一个自定义的 `location @router` 块,并在主 `location /` 中使用 `try_files` 引用该自定义路径,将所有非文件请求重定向到 `index.html` [^4]。 ```nginx location / { try_files $uri $uri/ @router; index index.html index.htm; } location @router { rewrite ^.*$ /index.html last; } ``` ### 3.5 前端配置建议 为了确保 Vue 项目的前端配置与 Nginx 的路径匹配,建议在 `vue.config.js` 中设置 `publicPath`,并确保 `vue-router` 的 `base` 属性与部署路径一致 [^3]。 ```javascript // vue.config.js module.exports = { publicPath: '/frontend' } ``` ```javascript // router/index.js const router = new VueRouter({ mode: 'history', base: '/frontend', routes }) ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值