• Vue项目History模式404问题解决


    本文主要解决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?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的现象了。(再次申明:以上只是针对本人所在的项目,不一定使用所有情况。)

  • 相关阅读:
    利用Vue这些修饰符帮我节省20%的开发时间
    ELK API
    ssh编译安装
    谷歌浏览器皮肤
    整理了100篇Linux技术精华
    使用Prometheus+Grafana监控MySQL实践
    mysqldiff
    kafka命令
    calico 文件丢失问题
    Prometheus 告警分配到指定接收组
  • 原文地址:https://www.cnblogs.com/dalaoyang/p/9875783.html
Copyright © 2020-2023  润新知