Vue项目History模式404问题解决方法


Posted in Javascript onOctober 31, 2018

本文主要解决Vue项目使用History模式发布到服务器Nginx上刷新页面404问题。(由于每个项目的情况都不尽相同,本方案已经完美解决本在所使用项目,具体情况可能还需要修改。)

1.项目背景分析

本人是Java后台开发,Vue其实使用也没有多久,只能说简单了解。发现问题的时候其实也一头雾水,第一思想就是百度看别人的思路。

1.1 查看项目打包后文件

首先看看项目打包后文件内容,看看有没有什么能突破的地方。文件目录如下:

Vue项目History模式404问题解决方法

打眼一看可以发现,主要的可能就是这个index.html文件,内容如下:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="utf-8">
 <title>系统管理</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <link rel="shortcut icon" type="image/x-icon" href="logo.png">
<link rel="shortcut icon" href="logo.png"></head>

<body>
 <div id="app"></div>
<script type="text/javascript" src="manifest.js?89b5083667173048a500"></script>
 <script type="text/javascript" src="vendor.js?9eae337435ee1b63d5cd"></script>
 <script type="text/javascript" src="index.js?38915745c7ed8b9143db"></script>
</body>

</html>

1.在之前百度的时候看到了一个信息,就是引入js文件使用scr的时候,如果前面带/是绝对路径,在思考是不是这个问题。

2.百度的时候大部分信息都是说修改Nginx配置文件。

2.问题解决

既然大致思路都有了,那么就开始尝试去解决一下。

2.1 更改Vue打包配置文件

修改webpack.config.js文件,这个是Vue-cli打包文件配置,使其打包后让index.html文件引用路径为绝对路径。webpack.config.js内容如下(每个项目打包配置均不同,这个配置仅仅是我使用的项目):

const resolve = require('path').resolve
const webpack = require('webpack')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const url = require('url')
const publicPath = '/'

module.exports = (options = {}) => ({
 entry: {
  vendor: './src/vendor',
  index: './src/main.js'
 },
 output: {
  path: resolve(__dirname, 'dist'),
  filename: options.dev ? '[name].js' : '[name].js?[chunkhash]',
  chunkFilename: '[id].js?[chunkhash]',
  publicPath: options.dev ? '/assets/' : publicPath
 },
 module: {
  rules: [{
    test: /\.vue$/,
    use: ['vue-loader']
   },
   {
    test: /\.js$/,
    use: ['babel-loader'],
    exclude: /node_modules/
   },
   {
    test: /\.css$/,
    use: ['style-loader', 'css-loader', 'postcss-loader']
   },
   {
    test: /\.(png|jpg|jpeg|gif|eot|ttf|woff|woff2|svg|svgz)(\?.+)?$/,
    use: [{
     loader: 'url-loader',
     options: {
      limit: 10000
     }
    }]
   }
  ]
 },
 plugins: [
  new webpack.optimize.CommonsChunkPlugin({
   names: ['vendor', 'manifest']
  }),
  new HtmlWebpackPlugin({
   template: 'src/index.html',
   favicon: 'src/logo.png' 
  })
 ],
 resolve: {
  alias: {
   '~': resolve(__dirname, 'src')
  },
  extensions: ['.js', '.vue', '.json', '.css']
 },
 devServer: {
  host: '127.0.0.1',
  port: 8010,
  proxy: {
   '/api/': {
    target: 'http://127.0.0.1:8080',
    changeOrigin: true,
    pathRewrite: {
     '^/api': ''
    }
   }
  },
  historyApiFallback: {
   index: url.parse(options.dev ? '/assets/' : publicPath).pathname
  }
 },
 devtool: options.dev ? '#eval-source-map' : '#source-map'
})

再次打包后,查看index.html,内容如下:

<!DOCTYPE html>
<html lang="en">

<head>
 <meta charset="utf-8">
 <title>系统管理</title>
 <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
 <link rel="shortcut icon" type="image/x-icon" href="logo.png">
<link rel="shortcut icon" href="/logo.png"></head>

<body>
 <div id="app"></div>
<script type="text/javascript" src="/manifest.js?f7d4b2121bc37e262877"></script><script type="text/javascript" src="/vendor.js?9eae337435ee1b63d5cd"></script><script type="text/javascript" src="/index.js?51954197166dd938b54e"></script></body>

</html>

从index.html可以看出已经变成了绝对路径。

2.2 修改Nginx配置

修改nginx.conf配置文件,代码如下:

worker_processes 1;

events {
  worker_connections 1024;
}

http {
  include    mime.types;
  default_type application/octet-stream;

  sendfile    on;

  keepalive_timeout 65;

  server {
   listen    80;
   server_name localhost;
   ## 指向vue打包后文件位置
   root /opt/nginx/dist/;

   ## 拦截根请求,例如http://localhost
   location / {
      try_files $uri $uri/ /index.html;
   }

   ## 拦截带有tms-monitor的请求,例如http://localhost/tms-monitor/admin
   location ^~/tms-monitor{
      if (!-e $request_filename) {
             rewrite ^/(.*) /index.html last;
             break;
      }
   }

   #error_page  500 502 503 504 /50x.html;
   location = /50x.html {
     root  html;
   }

  }
}

3.总结

上述配置完成后,打包Vue项目,重启Nginx再次刷新就不会在有404的现象了。(再次申明:以上只是针对本人所在的项目,不一定使用所有情况。)

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

Javascript 相关文章推荐
javascript 学习之旅 (1)
Feb 05 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
May 03 Javascript
js给onclick赋值传参数的两种方法
Nov 25 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
Apr 07 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
Aug 05 Javascript
JS前向后瞻正则表达式定义与用法示例
Dec 27 Javascript
javascript中replace使用方法总结
Mar 01 Javascript
史上最全JavaScript数组去重的十种方法(推荐)
Aug 17 Javascript
vue中过滤器filter的讲解
Jan 21 Javascript
解决vue $http的get和post请求跨域问题
Jun 07 Vue.js
TS 类型兼容教程示例详解
Sep 23 Javascript
Vue.js中对css的操作(修改)具体方式详解
Oct 30 #Javascript
vue组件中的样式属性scoped实例详解
Oct 30 #Javascript
node上的redis调用优化示例详解
Oct 30 #Javascript
elementUI 设置input的只读或禁用的方法
Oct 30 #Javascript
Vue.js 父子组件通信的十种方式
Oct 30 #Javascript
vue通过style或者class改变样式的实例代码
Oct 30 #Javascript
vue通过cookie获取用户登录信息的思路详解
Oct 30 #Javascript
You might like
收音机鉴频器对声音的影响和频偏分析
2021/03/02 无线电
PHP常用的缓存技术汇总
2014/05/05 PHP
PHP面向对象程序设计实例分析
2016/01/26 PHP
PHP采用超长(超大)数字运算防止数字以科学计数法显示的方法
2016/04/01 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
通用于ie和firefox的函数 GetCurrentStyle (obj, prop)
2006/12/27 Javascript
ExtJS 简介 让你知道extjs是什么
2008/12/29 Javascript
通过隐藏option实现select的联动效果
2009/11/10 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
JS实现文字掉落效果的方法
2015/05/06 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
js实现一个可以兼容PC端和移动端的div拖动效果实例
2016/12/09 Javascript
js实现字符全排列算法的简单方法
2017/05/01 Javascript
快速将Vue项目升级到webpack3的方法步骤
2017/09/14 Javascript
解决jquery有正确返回值但不执行success函数的问题
2018/08/20 jQuery
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
Python中用于去除空格的三个函数的使用小结
2015/04/07 Python
python字符类型的一些方法小结
2016/05/16 Python
Python 多核并行计算的示例代码
2017/11/07 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
python+PyQT实现系统桌面时钟
2020/06/16 Python
python判断单向链表是否包括环,若包含则计算环入口的节点实例分析
2019/10/23 Python
opencv 阈值分割的具体使用
2020/07/08 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
python 利用jieba.analyse进行 关键词提取
2020/12/17 Python
美国瑜伽服装和装备购物网站:Mukha Yoga
2019/02/22 全球购物
Trip.com澳大利亚:在线旅行社
2019/12/01 全球购物
应届毕业生专业个人求职自荐信格式
2013/11/20 职场文书
幸福家庭标语
2014/06/27 职场文书
社会发展项目建议书
2014/08/25 职场文书
村支部书记群众路线对照检查材料思想汇报
2014/10/08 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
担保书范文
2019/07/09 职场文书
详解Golang如何实现支持随机删除元素的堆
2022/09/23 Python