如何在子目录中的共享托管服务器上提供 VueJS 历史模式

How to serve VueJS history mode on shared hosting server in subdirectory

我一直在为此寻找解决方案,但仍然无法正常工作。我有一个带有历史模式路由器的 VueJS 应用程序

import Vue from 'vue'
import VueRouter from 'vue-router'
import Home from '../views/Home.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
  {
    path: '/about',
    name: 'About',
    component: () => import('../views/About.vue')
  }
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

export default router

假设我的域是 https://www.root.com,我想在 https://www.root.com/sub/(不是子域而是子目录)上提供这个应用程序。

这是我的服务器目录文件

--public_html
  --sub ( I place the VueJS code here)
  --index.html (html of root.com)
  --.htaccess (file to route)

之后,当我去 https://www.root.com/sub/ 。它完美地显示了 Home 组件。但是,如果我输入 https://www.root.com/sub/about 它显示 404 Not Found,但我希望它显示 About 组件。

但奇怪的是,如果我在 Home 组件中创建一个 link 导航到 About 组件,然后当我首先使用 [=17= 转到 Home 组件时],然后单击 link 转到 About 组件。有用 !但是刷新页面或者手动输入路由导致404 not found again

更新 1: 我在 Vue Router 中读到,他们说要编辑 Apachae .htaccess。所以我这样改了,但还是不行:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /sub/
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /index.html [L]
</IfModule>

这是我的 vue.config.js :

module.exports = {
  publicPath: '/sub/',
  outputDir: 'dist'
}

执行此操作后,转到“关于”页面将导航至 index.html of public_html

更新 2:我将 .htaccess 更改为:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /sub/
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /sub/ [R=301,L]
</IfModule>

现在,当我输入 root.com/sub/about 查看 About 组件时,它将导航到根目录中的 Home 组件。com/sub.

更新 3: 我的 htaccess 现在看起来像这样:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /sub/
  RewriteRule ^index\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /sub/ [L]
</IfModule>

现在可以正常使用了!但是,现在 root.com 有问题,所有 css 和 js 文件总是调用 /sub 中的文件而不是根文件夹

我是不是漏了什么地方?请帮忙 , P/s 我使用 Hostinger 作为托管平台。

我终于找到了方法,也许不是最优化的但它有效

RewriteEngine On
RewriteBase /
#### PERSISTENT CONTENT ####
DirectoryIndex index.php index.cgi index.html
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^\/(js\/main\.js|css\/(\d+|common|site)\.css)$
RewriteCond %{REQUEST_FILENAME} !-d
#### not match sub module
RewriteRule ^((?!sub).)*$ / [L,QSA]

#### This is for sub module
RewriteEngine On
RewriteBase /sub/
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteCond %{REQUEST_URI} ^\/(js\/main\.js|css\/(\d+|common|site)\.css)$
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^((sub).*)*$ /sub/index.html [L,QSA]