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

真正一劳永逸!

相关推荐
尾善爱看海5 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
weixin_BYSJ19875 小时前
【计算机毕设】基于SpringBoot与Vue的文物保护档案管理系统08621
vue.js·spring boot·spring cloud·微服务·架构·django·课程设计
Bs_MoneyMagnet6 小时前
基于springboot+vue的个人健康管理系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·vue3·springboot3·计算机毕业设计
驳是6 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea6 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持6 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者6 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn7 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
Bs_MoneyMagnet8 小时前
基于springboot+vue的心理咨询预约与随访平台的设计与实现 源码+文档
vue.js·spring boot·后端·spring·毕业设计·旅游·计算机毕业设计
计算机魔术师9 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端