SSF0SSF0
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
首页
前端
  • Node
  • Go
  • C#
  • MySql
  • Bash
  • Git
  • Docker
  • VuePress
  • CI/CD
  • 服务器
  • 网站
  • 学习资料
  • 软件
Timeline
Github
标签
分类
  • HTML

    • html1
    • html2
  • CSS

    • Flex 布局常见问题与解决方案
  • JavaScript

    • 数据类型及引用问题
    • 处理 Blob 类型文件下载问题总结
    • localStorage 与 sessionStorage 区别
    • JavaScript 中的 script 标签问题详解
    • JavaScript 中的`this`指向问题详解
    • SessionStorage踩坑记录:它真的能"只设置一次"吗?
    • 动态加载 JS 脚本方法对比
    • 浏览器页面关闭场景下的数据上报
  • es6

    • Promise
    • es6 模块导出方式全解析
  • Vue2

    • created VS mounted 发起异步请求
    • vue2-2
  • Vue3

    • Vite + Vue3 修改 element-plus 源码
    • Vue v-if 与 v-show
    • Vue3 ref 获取组件
    • Vue3 路由传参
    • 父子组件与组件里 Hooks 加载顺序
    • 第三方组件传入参数TS提示
    • Vue3 Props 在 Hooks 中的响应性处理
    • Vue Router 的两种历史模式及部署配置详解
    • 在Vue 3项目中顺利集成Tailwind CSS的完整指南
    • Vue 3 深度选择器:deep()完全指南
  • Electron

    • 快速构建 electron + vue3 项目
  • TS

    • TS 泛型
    • 记录模板使用断言的问题
    • type 与 interface
  • WebPack

    • Webpack 介绍
  • Vite

    • Vite CLI 常见命令
    • vite 与 webpack 比较
  • 项目工程

    • 前端代码风格
    • Vue3 项目规范
    • npm 镜像问题
    • 包管理工具
    • 使用 engines 限制开发环境依赖
    • 打包与shell交互指定模式
    • 使用 pnpm 构建 Monorepo 实战指南
    • pnpm 修改依赖源码打包报错
  • 记录一下小程序
  • 控制浏览器正确保存网站账号密码的技巧

Vue Router 的两种历史模式及部署配置详解

一、Vue Router 的两种历史模式

Vue Router 提供了两种主要的历史模式:Hash 模式和 History 模式,它们分别通过createWebHashHistory和createWebHistory来创建。

1. Hash 模式 (createWebHashHistory)

import { createRouter, createWebHashHistory } from "vue-router";

const router = createRouter({
  history: createWebHashHistory(),
  routes: [...]
});

特点:

  • URL 格式:使用井号(#),如 https://example.com/#/home

  • 不需要特殊服务器配置,因为#后的内容不会发送到服务器

  • 对搜索引擎不友好,#后内容通常不被索引

  • 适用于简单部署环境或不关注 SEO 的应用

2. History 模式 (createWebHistory)

import { createRouter, createWebHistory } from "vue-router";

const router = createRouter({
  history: createWebHistory(),
  routes: [...]
});

特点:

  • URL 格式:使用正常路径,如 https://example.com/home

  • 需要服务器配置支持,否则刷新页面会 404

  • 对搜索引擎友好,路由可以被正常索引

  • 适合生产环境、需要 SEO 友好的应用

二、History 模式下的刷新页面 404 问题

使用 History 模式时,当用户刷新页面或直接访问非根路径 URL(如/login、/profile等),服务器会尝试查找对应的文件。由于这些路径在服务器上实际不存在,服务器会返回 404 错误。

问题原因: 在单页应用中,这些路由实际上是由前端路由处理的,不是真实的服务器路径。当直接请求这些路径时,请求会发送到服务器,而服务器找不到对应资源。

三、解决方案——服务器配置

解决方案的核心是:将所有请求重定向到 index.html,让前端路由接管导航。

1. Nginx 配置

location / {
    try_files $uri $uri/ /index.html;
}

这是最常用的配置,指示 Nginx 尝试提供请求的文件,如果找不到则返回 index.html。

2. Docker + Nginx 配置

如果使用 Docker 部署,可以创建自定义的 nginx.conf:

server {
    listen 80;
    server_name _;
    root /usr/share/nginx/html;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }
}

然后在 docker-compose.yml 中挂载:

version: "3"

services:
  web:
    image: nginx:latest
    ports:
      - "8000:80"
    volumes:
      - .:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf
    restart: unless-stopped

3. Apache 配置

在项目根目录创建.htaccess文件:

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

4. Express (Node.js) 服务器

const express = require("express")
const path = require("path")
const app = express()

app.use(express.static(path.join(__dirname, "dist")))

// 处理所有路由
app.get("*", (req, res) => {
  res.sendFile(path.join(__dirname, "dist", "index.html"))
})

app.listen(8000)

四、宝塔面板 Nginx 配置

在宝塔面板中,不需要修改主配置文件,只需在站点配置文件中添加适当的 location 块:

步骤如下:

  • 在宝塔面板中创建新站点,或修改已有站点配置

  • 进入网站设置 -> 配置文件

  • 在 server{}块内添加以下配置:

server
{
    # 其他已有配置...

    # 关键配置:处理前端路由
    location / {
        try_files $uri $uri/ /index.html;
    }

    # 其他已有配置...
}

五、最佳实践建议

  1. 开发环境:可以使用任意模式,现代开发服务器会自动处理 History 模式。

  2. 生产环境:

    • 如果有服务器配置权限:优先使用 History 模式+合适的服务器配置

    • 如果没有服务器配置权限或简单静态托管:使用 Hash 模式避免问题

  3. SEO 要求:如果应用需要被搜索引擎索引,应使用 History 模式。

  4. 配置测试:部署后务必测试各个路由的直接访问和刷新功能。

总结

Vue Router 的两种历史模式各有优缺点,History 模式提供了更干净的 URL,但需要额外的服务器配置。通过正确配置服务器,可以解决 History 模式下的刷新页面 404 问题,让单页应用体验更完善。根据项目需求和部署环境,选择合适的模式,并确保服务器配置正确,是构建可靠 Vue 应用的关键一步。

最后更新时间:
贡献者: 何风顺
上一页
Vue3 Props 在 Hooks 中的响应性处理
下一页
在Vue 3项目中顺利集成Tailwind CSS的完整指南