IIS 部署 Vue/React 单页应用 (SPA) 刷新页面 404/403.18 报错原因及终极解决方案

一、问题现象(

项目环境:

  • 前台项目:http://localhost/CL/
  • 后台项目:http://localhost/CLadmin/
  • 框架:Vue3 + Vue-Router

现象:

  1. 页面内点击菜单跳转完全正常
  2. 一按 F5 刷新页面 → 直接报 404 / 403.18 错误
  3. 首次进入正常,刷新就崩

二、根本原因(最核心、最易懂的解释)

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
  • 不用配置重写规则
  • 不用处理跨应用池

真正一劳永逸!

相关推荐
mantou1328 小时前
从纯 CSR 到 SSR:用 WebComponents 做一个 Next.js 式框架 Gemkit
前端·全栈·web components
cidy_988 小时前
深度拆解任务工作台架构:左右分栏、队列管理、实时刷新全方案
前端
Linye8 小时前
告别“PRD 与原型两张皮”!我们把可交互原生组件直接嵌进了需求文档,还能双向回写 Markdown
前端
deli0078 小时前
RSA 为什么公开公钥也解不开?2 个质数拆开实测一遍
前端
ModyQyW8 小时前
vite-plugin-uni-pages 0.6:统一扫描规则,开发期少重启
前端·uni-app
门思科技8 小时前
把 ThinkLink 接进 Home Assistant 与 Node-RED:一条 MQTT 转发器能走通的路
前端
没事写点啥9 小时前
WeKnora 回答溯源
前端·后端·ai编程
LuHang9 小时前
Vue3 大屏项目 MQTT 实战:机场与无人机 OSD 实时数据总线
前端
2401_885885049 小时前
芬兰语音通知接口怎样对接?语音提醒接入流程
android·前端·python·php·语音识别
铁皮饭盒9 小时前
这6个小模型各有绝活, 且都可cpu/浏览器端运行
前端·后端