根本原因是服务器未将非资源路径请求(如/dashboard)回退至index.html,_redirects文件必须置于发布目录根路径才能被Netlify识别并执行重写规则。

单页应用部署到 Netlify 后刷新 404,根本原因不是代码写错了,而是服务器没把非资源请求(比如 /dashboard)交还给 index.html 处理 —— _redirects 文件就是干这个的,且必须放在发布目录根路径下。
为什么 _redirects 文件必须放在发布目录根目录
Netlify 只在构建产物的根目录扫描 _redirects;如果它在 src/ 或 public/ 里但没被复制到最终输出目录(如 dist/ 或 build/),规则完全不生效。常见错误是:本地开发时文件存在,但构建脚本没把它拷过去。
- 确认构建后 dist 目录下真有
_redirects(不是.redirects或_redirects.txt) - Vue CLI 用户需在
vue.config.js的configureWebpack中用CopyPlugin显式复制;Vite 用户可在build.rollupOptions.plugins加copy插件 - GitLab Pages 要求文件在
public/_redirects,且若用默认域名(namespace.gitlab.io/project),每行规则前缀必须加/project
/* /index.html 200 这行规则的含义和陷阱
这行是 SPA fallback 的核心,但它不是“重定向”,而是服务端重写(status 200 表示内容不变,只是换了个文件响应)。它告诉 Netlify:“所有不匹配真实文件的请求,都返回 index.html 的内容,状态码仍是 200”。
- 顺序很重要:规则按行匹配,第一条命中即终止;把
/* /index.html 200放太前面,会拦截掉你后面写的/api/* https://backend.example.com/:splat 200代理规则 - 别漏空格:
/*和/index.html之间必须有一个空格,状态码前也必须有空格,否则解析失败,整行被忽略 - 路径必须以
/开头,写成** /index.html 200或^.*$ /index.html 200都无效 —— Netlify 的_redirects不支持正则,只认/*和占位符
动态路由(如 /post/:id)怎么配才不 404
静态生成器(如 Gridsome、Nuxt、Next)构建后可能生成 /post/_id.html 这类文件,但用户访问的是 /post/123 —— 此时不能靠 /* /index.html 200,得单独映射。
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
立即学习“前端免费学习笔记(深入)”;
- 先确认构建产物里是否存在对应 HTML 文件(比如
dist/post/_id.html),不存在就说明生成逻辑有问题 - 在
_redirects中加一行:/post/:id /post/_id.html 200(注意不是:splat,:id是占位符,Netlify 会自动捕获并透传) - 多个动态段要写全:
/user/:userId/post/:postId→/user/_userId/post/_postId.html,不能省略中间的/post/ - 如果构建工具不生成带下划线的文件名(比如 Vite + Vue Router History 模式),那就不该走文件映射,而应回退到
/* /index.html 200让前端路由接管
验证配置是否生效的三个关键检查点
上线后仍 404,别急着改代码,先看这三项:
- 打开浏览器开发者工具的 Network 面板,刷新一个路由页(如
/about),看响应的Content-Type是text/html还是text/plain—— 如果是后者,说明_redirects没生效,Netlify 返回了原始 404 页面 - 访问
https://yoursite.netlify.app/_redirects,确认能直接下载到文件内容,且格式无误(无 BOM、无多余空行、无中文标点) - 在 Netlify 控制台的 “Site settings > Build & deploy > Post processing > Asset optimization” 里,确保没开启 “Minify HTML”,因为某些 minifier 会把
_redirects当作 HTML 文件处理并破坏格式
最容易被忽略的是构建产物中 _redirects 的实际位置和内容 —— 它不像 JS 或 CSS 会被打包工具自动注入,必须手动确保它出现在最终部署包的根目录,且每一行都符合 Netlify 的严格语法。任何空格、大小写、路径前缀的偏差都会让整条规则静默失效。


















