在使用 Vue Router 并采用 createWebHistory 创建路由实例时,由于其使用了 HTML5 的 History API,这会导致在部署到服务器上时,直接访问非根路径(如 /about 等二级路由)可能会出现 404 错误。这是因为服务器默认不知道如何处理这些路由请求,此时就需要对 Nginx 进行相应的配置来解决这个问题。
一、Vue Router 的 createWebHistory 简介
在 Vue Router 中,createWebHistory 用于创建一个基于 HTML5 History API 的路由实例。与默认的 createWebHashHistory 不同,createWebHistory 生成的 URL 没有哈希(#)符号,更加美观和符合现代 Web 应用的 URL 规范。例如,createWebHashHistory 下的 URL 可能是 https://example.com/#/about,而 createWebHistory 下的 URL 则是 https://example.com/about。
import { createRouter, createWebHistory } from 'vue-router';
import Home from './views/Home.vue';
import About from './views/About.vue';
const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{
path: '/about',
name: 'About',
component: About
}
];
const router = createRouter({
history: createWebHistory(),
routes
});
export default router;
二、Nginx 配置解决 404 问题
以下是一个基本的 Nginx 配置示例,用于处理 Vue Router 使用 createWebHistory 后的路由请求,确保能够正确访问各个路由页面:
server {
listen 80;
server_name your_domain.com; # 替换为你的域名
root /path/to/your/vue/app/dist; # 替换为你的 Vue 应用打包后的 dist 目录路径
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
error_page 404 /404.html;
location = /404.html {
internal;
}
}
上述配置的关键部分是 location / 块中的 try_files 指令:
$uri:尝试匹配请求的 URI。例如,如果请求/about,Nginx 会先查找服务器上是否存在/about这个文件或目录。$uri/:如果$uri不匹配,Nginx 会尝试匹配/about/这样的目录(如果存在)。/index.html:如果前面的尝试都失败,Nginx 会将请求重定向到index.html。由于 Vue Router 在index.html中会根据当前的 URL 来匹配相应的路由组件并渲染页面,所以能够正确处理非根路径的请求。
三、配置示例说明
listen和server_name:listen 80表示 Nginx 监听 80 端口,server_name配置为你的实际域名,确保 Nginx 能够正确响应来自该域名的请求。root:指定 Vue 应用打包后的dist目录路径,Nginx 会从这个目录中查找请求的文件。index:设置默认的索引文件,通常为index.html。try_files:按照指定的顺序尝试匹配请求的文件或目录,如果都不匹配,则重定向到index.html。error_page和location = /404.html:配置 404 错误页面,internal指令表示该location仅用于内部重定向,不会向客户端发送新的 HTTP 请求。
四、注意事项
-
路径替换:务必将
root指令中的路径替换为你实际的 Vue 应用打包后的dist目录路径。 -
域名配置:确保
server_name配置为正确的域名,否则可能会导致 Nginx 无法正确响应请求。 -
HTTPS 配置:如果你的应用使用 HTTPS,还需要配置 SSL 证书等相关内容,这里仅提供了基本的 HTTP 配置示例。
通过以上 Nginx 配置,你可以在使用 Vue Router 的 createWebHistory 后,正确地部署 Vue 应用,并解决 404 等路由访问问题,确保用户能够顺利访问应用的各个页面。
Monorepo 技术延展
解决Vue Router History模式的Nginx部署404问题后,多端场景下还可能面临路由跨容器适配、无侵入扩展需求。Finclip这类平台凭借小程序容器化、标准化SDK能力,可辅助强化路由在多环境的兼容性,与Nginx配置形成部署闭环。这个问题在工程上常见的解法是: 跨端路由适配、容器化部署、标准化SDK集成、无侵入扩展、多环境兼容管控。