nginx 中应使用 error_page 指令实现错误重定向,而非 rewrite 或 return;支持指向内部静态页(url 不变、状态码可改)、外部 url 跳转(302)或修改状态码(如 =200),并避免与 try_files 混用。

在 Nginx 的 location 块中实现错误重定向,核心是配合 error_page 指令,而不是靠 rewrite 或 return 直接处理 404 等状态码。Nginx 默认对不存在的资源返回 404,但你可以自定义这个响应的行为——包括返回静态错误页、跳转到其他地址,甚至修改状态码。
用 error_page 指向内部错误页(推荐)
这是最常用且安全的方式:当请求失败时,Nginx 内部直接返回你指定的 HTML 文件,URL 不变,状态码仍为 404(除非显式改写)。
- 确保错误页文件存在,比如
/usr/share/nginx/html/404.html - 在对应 location 或 server 块中添加:
error_page 404 /404.html; - 注意路径是相对于
root或alias设置的根目录,不是文件系统绝对路径 - 该方式不触发浏览器跳转,适合保持 SEO 友好和用户体验一致性
用 error_page 触发外部跳转(改变 URL 和状态码)
如果希望用户看到新地址(比如跳转到首页或维护页),可把 error_page 指向完整 URL:
- 配置示例:
error_page 404 https://example.com/error; - 此时浏览器地址栏会变成目标地址,HTTP 状态码变为 302(临时重定向)
- 若需永久跳转,建议改用
return 301配合 if 判断,但注意if在 location 中有使用限制
用 = 修饰符改写状态码
默认 error_page 404 /404.html 返回仍是 404 状态。如需返回 200(例如 SPA 应用兜底),加等号即可:
-
error_page 404 = /404.html;—— 表示用 /404.html 的响应体,但状态码由该页面实际返回值决定(通常为 200) - 更明确控制状态码可写成:
error_page 404 =200 /404.html; - 注意:这种写法要求目标文件能被正常读取,否则可能退回到默认 404
避免与 try_files 混用导致逻辑冲突
有人习惯用 try_files $uri /404.html; 实现“兜底”,但这本质是路径查找,不是错误处理:
- 它不会触发
error_page,也不会返回 404 状态码,而是返回 200 + 错误页内容 - 若需真实错误状态码(如利于监控或爬虫识别),优先选
error_page - 两者不要在同一 location 中同时使用,容易掩盖真实问题











