IIS 部署 Vue/React 单页应用 (SPA) 刷新页面 404/403.18 报错原因及终极解决方案
整个项目只有一个 index.html所有路由都是前端 JS 模拟出来的虚拟路径服务器上根本不存在这些文件夹!
·
一、问题现象(
项目环境:
- 前台项目:
http://localhost/CL/ - 后台项目:
http://localhost/CLadmin/ - 框架:Vue3 + Vue-Router
现象:
- 页面内点击菜单跳转完全正常
- 一按 F5 刷新页面 → 直接报 404 / 403.18 错误
- 首次进入正常,刷新就崩
二、根本原因(最核心、最易懂的解释)
1. 什么是 SPA(单页应用)?
整个项目只有一个 index.html所有路由 /home、/login、/user/list 都是前端 JS 模拟出来的虚拟路径服务器上根本不存在这些文件夹!
2. 为什么跳转正常、刷新报错?
- 菜单跳转:JS 改地址栏,不请求服务器 → 正常
- 浏览器刷新:把完整地址发给 IIS,IIS 去找真实文件夹→ 找不到 → 报 404→ 如果你配置了反向代理 / 跨应用池 → 报 403.18 无权重写
3. 为什么会出 403.18?
IIS 安全策略:默认禁止跨应用程序池进行 URL 重写你的前端、接口、代理不在一个池刷新时 IIS 拦截 → 403.18
三、终极最简单解决方案(不用改 IIS、不用配 web.config)
✅ 方案:把路由从 History 模式 → Hash 模式
只改一行代码,永久解决
修改方法(Vue3/Vue-Router4)
javascript
运行
// 原来(报错的写法)
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(),
routes
})
// 改成(不报错的写法)
import { createRouter, createWebHashHistory } from 'vue-router'
const router = createRouter({
history: createWebHashHistory(),
routes
})
为什么这样改就好了?
# 号后面的路由 不会发送给服务器刷新时,IIS 只收到 localhost/CL/永远只会访问 index.html永远不会 404 / 403.18
四、修改后效果
- 地址变成:
http://localhost/CL/#/home - 刷新任意页面都正常
- 不用改 IIS
- 不用加 web.config
- 不用配置重写规则
- 不用处理跨应用池
真正一劳永逸!
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)