Vue路由history模式解决404问题的几种方法


Posted in Javascript onSeptember 29, 2018

问题背景:

vue-router 默认是hash模式,使用url的hash来模拟一个完整的url,当url改变的时候,页面不会重新加载。但是如果我们不想hash这种以#号结尾的路径时候的话,我们可以使用路由的history的模式。比如如下网址:使用hash模式的话,那么访问变成 http://localhost:8080/bank/page/count/#/ 这样的访问,如果路由使用 history的话,那么访问的路径变成 如下:http://localhost:8080/bank/page/count 这样的了;

不过history的这种模式需要后台配置支持。比如:当我们进行项目的主页的时候,一切正常,可以访问,但是当我们刷新页面或者直接访问路径的时候就会返回404,那是因为在history模式下,只是动态的通过js操作window.history来改变浏览器地址栏里的路径,并没有发起http请求,但是当我直接在浏览器里输入这个地址的时候,就一定要对服务器发起http请求,但是这个目标在服务器上又不存在,所以会返回404

怎么解决呢?我们现在可以把所有请求都转发到 http://localhost:8080/bank/page/index.html上就可以了。

解决方案:

对于VUE的router[mode: history]模式在开发的时候,一般都不出问题。是因为开发时用的服务器为node,Dev环境中自然已配置好了。

但对于放到nginx下运行的时候,自然还会有其他注意的地方。总结如下:

在nginx里配置了以下配置后, 可能首页没有问题,但链接其他会出现(404)

location / {
      root  D:\Test\exprice\dist;
      index index.html index.htm;
      try_files $uri $uri/ /index.html;
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Credentials' 'true';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
    }
    
    location ^~/api/ {
      proxy_pass  http://39.105.109.245:8080/;
    }

为了解决404,需要通过以下两种方式:

1、官网推荐

location / {
root  D:\Test\exprice\dist;

index index.html index.htm;

try_files $uri $uri/ /index.html;

2、匹配errpr_page

location /{
root  /data/nginx/html;

index index.html index.htm;

error_page 404 /index.html;
}

3、 (vue.js官方教程里提到的https://router.vuejs.org/zh-cn/essentials/history-mode.html)

server {
    listen    8888;#默认端口是80,如果端口没被占用可以不用修改
    server_name localhost;
    root    E:/vue/my_project/dist;#vue项目的打包后的dist
    location / {
      try_files $uri $uri/ @router;#需要指向下面的@router否则会出现vue的路由在nginx中刷新出现404
      index index.html index.htm;
    }
    #对应上面的@router,主要原因是路由的路径资源并不是一个真实的路径,所以无法找到具体的文件
    #因此需要rewrite到index.html中,然后交给路由在处理请求资源
    location @router {
      rewrite ^.*$ /index.html last;
    }
    #.......其他部分省略
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让网页跳转到指定位置的jquery代码非书签
Sep 06 Javascript
探讨JavaScript中声明全局变量三种方式的异同
Dec 03 Javascript
js阻止事件追加的具体实现
Oct 15 Javascript
深入分析JQuery和JavaScript的异同
Oct 23 Javascript
如何用javascript计算文本框还能输入多少个字符
Jul 29 Javascript
JavaScript各类型的关系图解
Oct 16 Javascript
javascript如何创建对象
Aug 29 Javascript
Angularjs中的页面访问权限怎么设置
Nov 11 Javascript
Vue keep-alive实践总结(推荐)
Aug 31 Javascript
jquery实现限制textarea输入字数的方法
Sep 06 jQuery
解决vue移动端适配问题
Dec 12 Javascript
基于javascript的拖拽类封装详解
Apr 19 Javascript
对vue v-if v-else-if v-else 的简单使用详解
Sep 29 #Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
Sep 29 #Javascript
浅谈针对Vue相同路由不同参数的刷新问题
Sep 29 #Javascript
vue init webpack 建vue项目报错的解决方法
Sep 29 #Javascript
详解React之key的使用和实践
Sep 29 #Javascript
vue给组件传递不同的值方法
Sep 29 #Javascript
vue动画之点击按钮往上渐渐显示出来的实例
Sep 29 #Javascript
You might like
phpfans留言版用到的数据操作类和分页类
2007/01/04 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
PHP动态输出JavaScript代码实例
2015/02/12 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
jquery ready函数源代码研究
2009/12/06 Javascript
JS中处理与当前时间间隔的函数代码
2012/05/23 Javascript
Eclipse去除js(JavaScript)验证错误
2014/02/11 Javascript
改变状态栏文字的js代码
2014/06/13 Javascript
JavaScript中getUTCMinutes()方法的使用详解
2015/06/10 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
BootStrap轮播HTML代码(推荐)
2016/12/10 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
js数组方法reduce经典用法代码分享
2018/01/07 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
JavaScript实现文件下载并重命名代码实例
2019/12/12 Javascript
vue2.0实现列表数据增加和删除
2020/06/17 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
python中类的一些方法分析
2014/09/25 Python
彻底理解Python list切片原理
2017/10/27 Python
Python实现的堆排序算法原理与用法实例分析
2017/11/22 Python
利用Tkinter(python3.6)实现一个简单计算器
2017/12/21 Python
Python数据结构之哈夫曼树定义与使用方法示例
2018/04/22 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python Selenium 之数据驱动测试的实现
2019/08/01 Python
Python数学形态学实例分析
2019/09/06 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
手把手教你将Flask应用封装成Docker服务的实现
2020/08/19 Python
大专应届生个人的自我评价
2013/11/21 职场文书
工作违纪检讨书
2014/02/17 职场文书
主题班会演讲稿
2014/05/22 职场文书
会计个人实习计划书
2014/08/15 职场文书
专业见习报告范文
2014/11/03 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
Redis特殊数据类型HyperLogLog基数统计算法讲解
2022/06/01 Redis