vue hash改为history无法刷新或者404问题

需要运维同事的配合。。

一、问题描述及原因
1、问题描述
当我们将项目成功部署线上之后,按照路径正常访问项目时正常,在项目中使用目录跳转也正常,但是一旦刷新网页就会nginx404。并且直接使用二级路由的路径访问项目也是404

2、问题原因
首先官网对此有所解答,官网地址:vue-router Html5 History模式
大致来说就是vue-router模式使用hash模式:使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。所以适配性更好,刷新页面时也不会有问题存在。但是他的缺点就是会添加#号,看起来就很不正常。

所以我们会选择更加优美的history模式:充分利用 history.pushState API 来完成 URL 跳转而无须重新加载页面。

但是页面刷新时,nginx就会根据你的路由寻找页面。

举个例子:
我的项目是部署在nginx的html文件夹的assembly目录下

 

 

那我访问时就是:
http://128.129.103.157/assembly

如果我进入二级目录时,当前路径就是:
http://128.129.103.157/assembly/about

这时我刷新浏览器的页面,nginx就会按照路径去找对应的页面,他就会去assembly文件夹下面的about文件夹下面去找index.html,但是我们的vue是单页面应用,根本就没有about文件夹,所以自然就找不到,也就会nginx 404。

二、解决方法
我们按照官方说法,修改nginx的配置,在服务端增加一个覆盖所有情况的候选资源:如果 URL 匹配不到任何静态资源,则应该返回同一个 index.html 页面,这个页面就是你 app 依赖的页面。

意思就是:只要你浏览器访问的是我项目下的路径,就给我跳转到我项目中的那唯一一个index.html,这样就不会出现404,而且路由还会被vue-router所捕获到,仍旧在当前页面刷新,并不会被重定向到首页

1.项目部署在根目录时
也就是你的nginx的html目录里面就是你的vue项目
配置方式按照官网所说
在nginx.conf里面的server下面的

location / {
    root   html;
    index  index.html index.htm;
}

中增加一句
try_files $uri $uri/ /index.html;

最后应该是

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

代表凡是匹配到 / 都会被跳转到 / 下的index.html

2.项目部署在自定义目录
一般我们都不会吧项目部署在根目录,因为我们部署的项目一般不止一个,而且部署在根目录不太易于管理
这样我们就要稍微修改一下配置

location / {undefined
}

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

 

 

你就将 ‘assembly/’ 替换成你的 ‘文件夹名称/’ 即可
如果是多级目录,就依次在后面拼接

配置修改完成之后记得重启nginx
/usr/local/nginx/sbin/nginx -s reload


————————————————
版权声明:本文为CSDN博主「程序员的脱发之路」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43845090/article/details/108923073

posted @ 2022-03-15 18:56  从入门到入土  阅读(1757)  评论(0编辑  收藏  举报