Vue Router 2 的 HTML5 History 模式:从配置到服务器回退的完整实战指南
前端路由【免费下载链接】vue-router The official router for Vue 2项目地址https://gitcode.com/gh_mirrors/vu/vue-router点击查看免费下载导读vue-router默认使用 Hash 模式URL 带#而HTML5 History 模式history mode能让你获得形如http://oursite.com/user/id的正常URL为 Vue 2 应用提供更干净、更友好的地址形态。本指南以仓库 docs-gitbook/de/essentials/history-mode.md 的完整内容为主线结合 src/router.js、src/history/html5.js 等源码与 examples 下的真实示例带你完成从开启 history 模式到为 Apache、nginx、Node.js、IIS、Caddy、Firebase 等主流服务器配置 catch-all 回退再到在 Vue 应用内兜底 404 页面的全流程并理解其底层原理与base、fallback等配置项的取舍。为什么需要 history 模式Hash 模式的局限vue-router的默认模式是Hash 模式它利用 URL 中的#hash来模拟完整的 URL从而在 URL 变化时不触发页面重新加载。从源码角度看Hash 模式由 src/history/hash.js 中的HashHistory实现它监听popstate或在不支持pushState时退化为hashchange事件通过读写window.location.hash完成导航。Hash 模式最大的问题是 URL 形态不美观http://oursite.com/#/user/id。对用户和搜索引擎都不够友好。而history 模式直接使用 HTML5 的history.pushStateAPI 实现无刷新导航从而去掉#号。从 src/router.js 可以看到模式选择的默认逻辑let mode options.mode || hash this.fallback mode history !supportsPushState options.fallback ! false if (this.fallback) { mode hash } if (!inBrowser) { mode abstract } this.mode mode即默认hash当显式指定history但浏览器不支持pushState且未关闭fallback时自动降级回hash在非浏览器环境如 Node.js下强制使用abstract模式。开启 history 模式只需在创建VueRouter实例时设置mode: historyconst router new VueRouter({ mode: history, routes: [...] })启用后URL 会呈现正常的路径形态例如http://oursite.com/user/id。整个仓库的 examples 目录下几乎所有示例都采用了mode: history例如 examples/basic/app.js、examples/named-routes/app.js、examples/scroll-behavior/app.js可以直接打开验证效果。底层发生了什么HTML5History 的导航链路开启 history 模式后VueRouter会实例化 src/history/html5.js 中的HTML5History类见 src/router.js 的switch分支。其核心导航链路如下push(location)先执行transitionTo完成路由守卫与组件解析成功后调用pushState(cleanPath(this.base route.fullPath))把新 URL 写入地址栏src/history/html5.jsreplace(location)逻辑与push相同但使用replaceState不产生新的历史记录src/history/html5.jssetupListeners()注册window.addEventListener(popstate, ...)监听浏览器前进/后退事件并处理滚动行为src/history/html5.jsgo(n)直接透传window.history.go(n)src/history/html5.js。pushState/replaceState的底层实现在 src/util/push-state.js它会在调用前保存滚动位置并给 history state 打上key以便恢复滚动值得注意的是它对 Safari 做了保护——Safari 限制 100 次pushState调用DOM Exception 18因此用try...catch包裹出错时回退到window.location.assign/window.location.replace。配置项mode / base / fallback在 docs/api/README.md 中与 history 模式直接相关的三个配置项为配置项类型默认值说明modestringhash浏览器/abstractNode.js可选hash \| history \| abstract。history需要 HTML5 History API 和服务器配置支持abstract适用于所有 JS 环境非浏览器环境下会被自动强制启用basestring/应用的基础 URL。例如整个 SPA 部署在/app/下时base应设为/app/fallbackbooleantrue当mode为history但浏览器不支持history.pushState时是否回退到hash模式。设为false时在 IE9 中每次router-link导航都会变成整页刷新——这对服务端渲染SSR场景很有用因为 hash 模式 URL 无法与 SSR 配合base的规范化逻辑在 src/history/base.js 的normalizeBase中若未显式指定会优先读取 HTML 文档中的base标签的href会保证以/开头并去除末尾斜杠。HTML5History.getLocation在解析当前路径时也会结合base正确裁剪前缀见 src/history/html5.js。部署到子目录时英文版官方文档特别提示见 docs/guide/essentials/history-mode.md若应用部署在子文件夹而非根目录应使用 Vue CLI 的publicPath选项以及路由器的base属性同时把下文服务器配置中的根路径如RewriteBase /替换为子文件夹路径如RewriteBase /name-of-your-subfolder/。问题所在直接访问 URL 会得到 404History 模式有一个绕不开的问题应用本质上是运行在浏览器端的单页应用SPA如果服务器没有做相应配置用户直接在地址栏访问http://oursite.com/user/id时服务器会在这个路径下找不到任何静态文件从而返回404。解决办法是在服务器配置中加入一条catch-all 回退规则——只要 URL 不匹配任何静态文件或目录就统一把应用所在的index.html返回给浏览器由前端路由接管后续渲染。下面给出各主流服务器的配置方案。各服务器 catch-all 回退配置以下示例均假设应用部署在根目录。Apache使用mod_rewrite模块IfModule mod_negotiation.c Options -MultiViews /IfModule IfModule mod_rewrite.c RewriteEngine On RewriteBase / RewriteRule ^index\.html$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.html [L] /IfModule规则含义拆解Options -MultiViews关闭内容协商避免 Apache 自动把/user/id映射到index.html之外的资源RewriteRule ^index\.html$ - [L]对index.html本身的请求直接放行不再重写RewriteCond %{REQUEST_FILENAME} !-f请求的文件不存在RewriteCond %{REQUEST_FILENAME} !-d请求的目录不存在RewriteRule . /index.html [L]其余所有请求一律重写到/index.html。除mod_rewrite外也可以使用 Apache 的FallbackResource指令mod_dir模块实现同样的效果。nginx在server块中location / { try_files $uri $uri/ /index.html; }try_files依次尝试请求的路径是否存在对应文件$uri→ 是否是目录$uri/→ 都不满足则回退到/index.html。Node.js 原生 HTTP 服务器不依赖任何框架用 Node 原生http模块实现const http require(http) const fs require(fs) const httpPort 80 http.createServer((req, res) { fs.readFile(index.html, utf-8, (err, content) { if (err) { console.log(We cannot open index.html file.) } res.writeHead(200, { Content-Type: text/html; charsetutf-8 }) res.end(content) }) }).listen(httpPort, () { console.log(Server listening on: http://localhost:%s, httpPort) })这段代码对所有请求都直接返回index.html适合纯前端 SPA 场景若有静态资源需要先判断请求路径再做静态文件服务。Node.js Express对于 Node.js/Express 项目官方推荐使用connect-history-api-fallback中间件。该中间件专门解决 history 模式的回退问题会拦截所有不匹配静态资源的请求并转发到index.html。仓库自带的示例服务器 examples/server.js 展示了 Express 下的完整做法它用express-urlrewrite把每个示例目录下的/*请求重写到对应目录的index.html再用express.static托管静态文件。这正是 history 模式 Express 的标准工作方式运行node examples/server.js后即可在http://localhost:8080下访问各个 history 模式示例。IISInternet Information Services安装 IIS UrlRewrite 扩展在站点根目录创建web.config内容如下?xml version1.0 encodingUTF-8? configuration system.webServer rewrite rules rule nameHandle History Mode and custom 404/500 stopProcessingtrue match url(.*) / conditions logicalGroupingMatchAll add input{REQUEST_FILENAME} matchTypeIsFile negatetrue / add input{REQUEST_FILENAME} matchTypeIsDirectory negatetrue / /conditions action typeRewrite url/ / /rule /rules /rewrite /system.webServer /configuration规则逻辑与 Apache 版一致请求既不是真实文件IsFile取反也不是真实目录IsDirectory取反时重写到站点根目录/。CaddyCaddy v2try_files {path} /Caddy v1rewrite { regexp .* to {path} / }Firebase Hosting在firebase.json中添加 rewrite 规则{ hosting: { public: dist, rewrites: [ { source: **, destination: /index.html } ] } }source: **匹配所有路径统一重写到/index.html。重要警告服务器不再返回 404 了引入 catch-all 回退后有一个副作用服务器将不再对任何不存在的路径返回 404因为所有未匹配路径最终都会拿到index.html。此时404 页面必须由 Vue 应用自己处理。在 Vue 应用内兜底 404 页面在路由配置中添加一条 catch-all 路由来渲染 404 组件。Vue Router 2 支持两种写法方式一文档写法const router new VueRouter({ mode: history, routes: [ { path: *, component: NotFoundComponent } ] })方式二带名称与通配捕获推荐const router new VueRouter({ mode: history, routes: [ { path: /:catchAll(.*), component: NotFoundComponent, name: NotFound } ] })第二种写法基于path-to-regexp的命名通配参数/:catchAll(.*)可以捕获任意剩余路径并给路由命名name: NotFound便于在代码中通过router.push({ name: NotFound })编程式跳转。替代方案服务端路由参与 404 判断如果你使用 Node.js 服务器也可以在服务端完成更精细的 404 判断让服务端路由系统对进来的 URL 进行匹配只有当 URL 对应 Vue 应用已注册的路由时才回退到index.html否则返回真正的 404。这也正是服务端渲染SSR方案所采用的做法——可进一步参考 Vue 的 SSR 文档了解完整实现。快速验证跑起仓库里的 history 模式示例仓库 examples 目录下的所有示例均已开启mode: history可以按以下步骤快速验证安装依赖使用 yarn 或 npmyarn install启动示例服务器见 examples/server.js默认监听http://localhost:8080node examples/server.js浏览器访问各示例例如http://localhost:8080/basic/、http://localhost:8080/named-routes/直接刷新或手工输入子路径如/basic/foo确认服务器回退规则让 SPA 正常接管。注意示例服务器通过express-urlrewrite将每个示例目录下的子路径重写到对应index.htmlexamples/server.js这正对应上文服务器 catch-all 回退在生产环境中的部署形态。小结Hash 模式是默认模式URL 带#、无需服务器配置history 模式通过history.pushState提供正常URL但必须配合服务器 catch-all 回退否则直接访问子路径会 404。主流服务器Apache / nginx / Node.js / Express / IIS / Caddy / Firebase都有成熟的回退配置方案本文已给出可直接使用的完整配置。catch-all 回退会让服务器失去 404 能力因此必须在 Vue 应用内用path: *或path: /:catchAll(.*)定义 404 页面Node.js 服务端还可以用服务端路由做更精确的 404 判断。与 history 模式配套的配置项mode、base、fallback分别控制模式选择、子目录部署和旧浏览器降级行为源码层面的支撑可查阅 src/router.js、src/history/html5.js、src/util/push-state.js 与 docs/api/README.md。赞分享前端路由【免费下载链接】vue-router The official router for Vue 2项目地址https://gitcode.com/gh_mirrors/vu/vue-router点击查看免费下载相关推荐vue-router HTML5 History 模式实战指南原理、服务端配置与 404 兜底方案vue router HTML5 History 模式实战指南原理、服务端配置与 404 兜底方案 vue router 默认使用 hash 模式通过 UR前端路由electerm 使用指南SSH、桌面与文件传输一个窗口全搞定electerm 使用指南SSH、桌面与文件传输一个窗口全搞定 这篇 electerm 使用教程以先跑起来的思路展开讲清安装、首次配置和连上第一台 S前端路由深度解析Beads基于Dolt的分布式AI代理任务跟踪架构深度解析Beads基于Dolt的分布式AI代理任务跟踪架构 Beads是一个为编码代理提供结构化记忆升级的开源项目通过版本控制的依赖感知图取代传统的Mark前端路由创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

米氏散射计算数值失稳?复折射率下的稳定递推算法解析

米氏散射计算数值失稳?复折射率下的稳定递推算法解析

简介:一套基于Mie散射理论、在MATLAB环境下运行的光学参数计算程序包,适用于大气气溶胶、云滴、纳米颗粒等球形粒子的散射、吸收与消光特性分析。程序依据H.A. Mie于1908年提出的经典理论,通过输入颗粒半径、复折射率和入射光波长&#xff0c…

2026/9/21 13:47:13 阅读更多 →
Java Web应用环境迁移常见问题与解决方案

Java Web应用环境迁移常见问题与解决方案

1. 项目背景与问题概述最近在负责一个名为"苍穹外卖"的线上订餐系统从测试环境迁移到生产环境的过程中,遇到了四个典型的报错问题:JDK版本不兼容、数据源配置异常、端口占用冲突以及JWT令牌验证失败。这些问题看似独立,实际上环环相…

2026/9/20 11:51:17 阅读更多 →
Python桌面项目实战:tkinter+sqlite3+matplotlib构建校园书店管理系统

Python桌面项目实战:tkinter+sqlite3+matplotlib构建校园书店管理系统

简介:基于Python、tkinter、sqlite3与matplotlib打造的校园书店管理系统,是一款面向高校书店场景、适合Python初学者及课程设计参考的完整桌面应用示例。系统以tkinter构建图形界面,借助sqlite3实现数据持久化,并通过matplotlib展…

2026/9/21 13:47:51 阅读更多 →

最新新闻

CANN ops-transformer FlashAttn 性能建模:D=256 下基本块 (M, N) 的选择与 Cube Bound 达成分析

CANN ops-transformer FlashAttn 性能建模:D=256 下基本块 (M, N) 的选择与 Cube Bound 达成分析

CANN ops-transformer FlashAttn 性能建模:D256 下基本块 (M, N) 的选择与 Cube Bound 达成分析 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-t…

2026/9/21 12:04:03 阅读更多 →
VSS横向扩展指南:如何把视频AI处理规模从单机扩展到生产级

VSS横向扩展指南:如何把视频AI处理规模从单机扩展到生产级

VSS横向扩展指南:如何把视频AI处理规模从单机扩展到生产级 【免费下载链接】video-search-and-summarization NVIDIA AI Blueprint for video search and summarization (VSS) is a GPU-accelerated reference architecture for building video analytics agents wi…

2026/9/21 12:02:56 阅读更多 →
MCP Python SDK 依赖注入实战:用 `Resolve` 让工具参数脱离模型幻觉

MCP Python SDK 依赖注入实战:用 `Resolve` 让工具参数脱离模型幻觉

MCP Python SDK 依赖注入实战:用 Resolve 让工具参数脱离模型幻觉 【免费下载链接】python-sdk The official Python SDK for Model Context Protocol servers and clients 项目地址: https://gitcode.com/gh_mirrors/pythonsd/python-sdk 在 MCP&#xff08…

2026/9/21 12:02:56 阅读更多 →
Foam for VS Code 深度指南:用 Markdown + Wikilinks 构建本地优先的个人知识库

Foam for VS Code 深度指南:用 Markdown + Wikilinks 构建本地优先的个人知识库

Foam for VS Code 深度指南:用 Markdown Wikilinks 构建本地优先的个人知识库 【免费下载链接】foam A personal knowledge management and sharing system for VSCode 项目地址: https://gitcode.com/gh_mirrors/fo/foam Foam 是一款运行在 VS Code 之内的…

2026/9/21 12:02:56 阅读更多 →
Nix 1.11 发布说明深度解读:确定性构建验证、Nix 表达式预取与沙箱命名统一

Nix 1.11 发布说明深度解读:确定性构建验证、Nix 表达式预取与沙箱命名统一

Nix 1.11 发布说明深度解读:确定性构建验证、Nix 表达式预取与沙箱命名统一 【免费下载链接】nix Nix, the purely functional package manager 项目地址: https://gitcode.com/gh_mirrors/ni/nix 导读 本文基于 Nix 官方发布说明 rl-1.11.md,系…

2026/9/21 12:01:54 阅读更多 →
Torchvision 内部代码同步脚本 fbcode_to_main_sync.sh 使用指南:将 fbsync 分支变更批量落地为开源 PR

Torchvision 内部代码同步脚本 fbcode_to_main_sync.sh 使用指南:将 fbsync 分支变更批量落地为开源 PR

计算机视觉深度学习图像处理数据集 【免费下载链接】vision Datasets, Transforms and Models specific to Computer Vision 项目地址: https://gitcode.com/gh_mirrors/vi/vision 点击查看 免费下载 本篇文章围绕 scripts/README.rst 所记载的唯一实用脚本 fbcode…

2026/9/21 12:01:54 阅读更多 →

日新闻

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程

agents-generator 决策矩阵全解析:从项目检测到 AGENTS.md 规则生成的 16 步判定流程 【免费下载链接】agentic-awesome-skills AAS Core is the local, agent-first control plane for complete catalog discovery, agent-owned selection, stack validation, and …

2026/9/21 0:00:01 阅读更多 →
gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析

gin-vue-admin 前端工具函数全景指南:src/utils 复用规范与源码级解析 【免费下载链接】gin-vue-admin 🚀ViteVue3Gin拥有AI辅助的基础开发平台,企业级业务AI开发解决方案,内置mcp辅助服务,内置skills管理,…

2026/9/21 0:00:01 阅读更多 →
Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

Wox 全功能插件开发实战指南:基于 Python / Node.js 宿主与 WebSocket 的持久化插件体系

桌面应用AI 应用插件系统 【免费下载链接】Wox A cross-platform launcher that simply works 项目地址: https://gitcode.com/gh_mirrors/wo/Wox 点击查看 免费下载 全功能插件(Full-featured Plugin)是 Wox 三类插件实现方式中能力最完整的…

2026/9/21 0:00:01 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/21 3:13:20 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/21 2:19:36 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/21 4:51:05 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →