视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Vue项目History模式404问题解决方法
2020-11-27 22:05:35 责编:小采
文档


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

1.项目背景分析

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

1.1 查看项目打包后文件

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

打眼一看可以发现,主要的可能就是这个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?b5083667173048a500"></script>
 <script type="text/javascript" src="vendor.js?9eae337435ee1b63d5cd"></script>
 <script type="text/javascript" src="index.js?315745c7ed8b9143db"></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="https://www.gxlcms.com/manifest.js?f7d4b2121bc37e262877"></script><script type="text/javascript" src="https://www.gxlcms.com/vendor.js?9eae337435ee1b63d5cd"></script><script type="text/javascript" src="https://www.gxlcms.com/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的现象了。(再次申明:以上只是针对本人所在的项目,不一定使用所有情况。)

下载本文
显示全文
专题