nginx中404重定向到主页分两种:一是内部重写(url不变,如error_page 404 =200 /index.html),适用于spa;二是真实跳转(url变,如error_page 404 @tohome + location @tohome { return 302 /; }),需proxy_intercept_errors on才能拦截反向代理的404。

在 Nginx 基础配置中,让 404 错误“重定向到主页”,关键要分清两种常见意图:一种是**保持原 URL 显示首页内容(状态码仍为 404 或改为 200)**;另一种是**真实跳转,浏览器地址栏变成主页 URL(返回 301/302)**。两者写法完全不同,不能混用。
显示首页内容(内部重写,URL 不变)
这种做法不改变浏览器地址栏,只是把首页 HTML 当作错误响应体返回,适合单页应用(SPA)或 SEO 隐藏错误场景:
- 用 等号 = 指定状态码:例如
error_page 404 =200 /index.html;—— 返回 200 状态码 +/index.html内容 - 确保
/index.html文件存在,且所在路径能被 Nginx 正确解析(依赖root或alias配置) - 不需要额外
location块,但推荐加internal;保护该路径不被直接访问(如放在location = /index.html { internal; }中)
真实跳转到主页(地址栏变化,HTTP 重定向)
这是用户常说的“跳转”——浏览器发起新请求,URL 变成 / 或完整域名首页:
- 使用命名 location 配合
return 302(临时)或return 301(永久):error_page 404 @tohome;<br>location @tohome { return 302 /; } - 若跳转到带协议的完整地址(如
https://example.com/),return后直接写 URL 即可 - 注意:不能在普通
location /块里写error_page来处理自身,否则可能触发循环
反向代理下必须启用拦截
如果你用 proxy_pass 转发请求(比如后端 PHP、Node.js),默认情况下后端返回的 404 不会被 Nginx 的 error_page 捕获:
- 在对应
location块中添加:proxy_intercept_errors on; - 否则即使配置了
error_page 404 /index.html,用户看到的仍是后端原始 404 响应
全局统一配置更简洁
如果全站都希望 404 跳主页,建议在 http 块中统一设置,避免每个 server 重复写:
http { error_page 404 @tohome; }- 再在任意层级定义
location @tohome { return 302 /; }(通常放http或server级) - 子
server可覆盖此行为,按需单独配置











