【路由】记一次nginx vue-router history模式配置

接触vue已经好几年了,一直使用的是默认hash模式,曾经尝试用nginx配置history模式,但是一发布到自己的网站就404。辗转几次就作罢。

今天没事反看了下vue文档,看到express,遂想到了,既然有express,那么肯定有koa2的,果然找到了一个插件koa2-connect-history-api-fallback,按照教程尝试了一下,https://lanling.diumx.com 能打开。刷新,不错。

/* history模式 */
const { historyApiFallback } = require('koa2-connect-history-api-fallback')
app.use(historyApiFallback({
    /** 这里配置了api白名单,因为网站下的api是接口 */
    whiteList: ['/api']
}))
app.use(...)

但是当我切换到https://lanling.diumx.com/task/checkin再次刷新页面,页面出现了空白,返回了404,震惊我了!!!

为什么!!!
不要慌,我打开控制台看了下,在获取资源的时候,路由/task/checkin指向了

Request URL: https://lanling.diumx.com/task/js/chunk-2fd36b68.7be22cca.js
Request Method: GET

所有的js,css,img文件都指向了task文件夹下
但是网站下是没有task文件夹的,这样肯定不对,我就尝试自己写一个中间件查看url,请求的url是

/task/js/chunk-2fd36b68.7be22cca.js
/task/img/chunk-4238dha.fasd1.png
/task/css/chunk-42fasd.312313nd.css

但是
/js/chunk-2fd36b68.7be22cca.js
/img/chunk-4238dha.fasd1.png
/css/chunk-42fasd.312313nd.css
才是正确的,所以我就做了一下转折
首先配置打包,把is/img/css静态资源打包到assets文件夹下

这里以vue-cli4为例,在vue.config.js增加配置

module.exports = {
    ...
    assetsDir:'assets',
    ...
} 

然后
在koa2的入口配置一个自定义中间件

/* history模式 */
const { historyApiFallback } = require('koa2-connect-history-api-fallback')
/** 改写url开始 */
app.use(async (ctx, next) => {
    let { method, query, body, url } = ctx.request
    if(url.includes('/assets')) {
        ctx.request.url = ctx.originalUrl = '/assets' + ctx.request.url.split('assets')[1]
    }
    await next()
})
/** 改写url结束 */
app.use(historyApiFallback({
    /** 这里配置了api白名单,因为网站下的api是接口 */
    whiteList: ['/api']
}))
app.use(...)

刷新,ok。

以上是我查阅了很多koa2-connect-history-api-fallback, koa-static, koa-router 配置没有找到相关方案,然后自己修改url的解决方案(无奈之举),如果您看到这篇文章,有更好的方案,麻烦告知一下,谢谢

2021年8月4号,时隔近两月,我又找到一种通过nginx配置的方式,其实如果再细分一下,是3种方式
方式一:nginx(最优)

server {
    listen       80;
    server_name  mulan.diumx.com;
    location / {
        # 静态文件目录
        root html/mulan/;
        # 请求js,css,img等资源从网址根目录下
        proxy_set_header Host $host;
        # vue官方给的配置方式,其实单独配置下面这条,是不行的,还需要上面那条,注意两条位置别搞反了
        try_files $uri $uri/ /index.html;
    }
    # 代理api
    location /api/ {
        proxy_pass         http://127.0.0.1:8040;
    }
}

方式二:nginx+打包添加base/publicPath

server {
    listen       80;
    server_name  mulan.diumx.com;
    location / {
        # 静态文件目录
        root html/mulan/;
        # vue官方给的配置方式,其实单独配置下面这条,是不行的,还需要上面那条,注意两条位置别搞反了
        try_files $uri $uri/ /index.html;
    }
    # 代理api
    location /api/ {
        proxy_pass         http://127.0.0.1:8040;
    }
}
// vue.config.js
module.exports = {
        // vue-cli3里识别的是publicPath
    publicPath: process.env.NODE_ENV === 'production' ? 'http://mulan.diumx.com/' : '/',
        // 如果你使用的是vite,那么请把publicPath换成base即可
}

方式三:nginx+base href

server {
    listen       80;
    server_name  mulan.diumx.com;
    location / {
        # 静态文件目录
        root html/mulan/;
        # vue官方给的配置方式,其实单独配置下面这条,是不行的,还需要上面那条,注意两条位置别搞反了
        try_files $uri $uri/ /index.html;
    }
    # 代理api
    location /api/ {
        proxy_pass         http://127.0.0.1:8040;
    }
}
// index.html
// 在你的index.html中添加base href即可,href为你网址

    
        

从上面可以看出,第一种最合适,第二种和第三种都是围绕着js/css/img文件前缀在做工作,二三如果还发布地址就要重新发版,不太好,所以还是要使用方式一,第二三只做了解吧。

2021年11月9日终极解决方案

location / {
    root html/前端代码文件夹/;
    # 关键部分
    proxy_set_header Host $host;
    try_files $uri $uri/ /index.html;
}

你可能感兴趣的:(【路由】记一次nginx vue-router history模式配置)