nginx错误页面重定向需区分内部展示(地址栏不变、状态码保留)与外部跳转(地址栏更新、状态码为301/302),并依作用域在http/server/location层级合理配置error_page,配合命名location、return及proxy_intercept_errors等指令实现精准控制。

在 Nginx 中配置灵活的错误页面重定向策略,关键不是堆砌规则,而是分清“内部展示”和“外部跳转”两种目的,并按作用域合理组织配置。核心在于用好 error_page 指令配合命名 location、return 和拦截开关,避免常见套娃或失效问题。
区分两类重定向场景
404 等错误处理有两大类行为:
- 内部返回静态页:浏览器地址栏不变,状态码仍是 404,适合 SEO 友好型错误提示;
- 外部重定向到新 URL:浏览器跳转,地址栏更新,状态码变为 301 或 302,适合页面迁移或兜底引流。
两者不能混用——比如写 error_page 404 /404.html 后又没配 location = /404.html,结果就是 404 套娃;而想跳转却漏了 = 符号,就会只返回白页或默认错误。
按需选择配置层级
全局统一还是单站定制?取决于业务规模:
- 全站共用一套错误页(如公司官网所有子域):在
http块中定义error_page,并设好统一root; - 不同域名需不同处理(如主站跳首页、API 站跳文档页):把
error_page放在对应server块内; - 某路径下特殊处理(如
/admin/出错跳登录页):直接写进location /admin/里。
注意:if 块里不能写 error_page,Nginx 会静默忽略;http 层配置可被 server 层覆盖,调试时优先查具体 server 块。
让后端错误也能触发重定向
反向代理或 FastCGI 场景下,后端返回 404 默认不会走 Nginx 的 error_page,必须显式开启拦截:
- 代理后端(如 Node.js、Java):在
location块加proxy_intercept_errors on;; - PHP-FPM:加
fastcgi_intercept_errors on;; - 确认后端确实返回标准 404 状态码,可用
curl -I验证,别依赖响应体内容。
开启后,再配 error_page 404 = @notfound 就能正常中转到命名 location 执行跳转逻辑。
安全跳转不踩坑
用 return 301 实现跳转时,$host 不可靠,尤其面对 IP 直连或异常 Host 头:
- 禁止直接写
return 301 https://$host$request_uri;; - 推荐方式一:固定目标域名,如
return 301 https://www.example.com$request_uri;; - 推荐方式二:白名单校验,
if ($host ~ ^(example\.com|www\.example\.com)$) { return 301 https://$host$request_uri; }; - 对未识别 Host 头的请求,建议用
return 444;直接断连,防滥用。
HTTP 跳 HTTPS 必须单独监听 80 端口,在独立 server { listen 80; ... } 里做 return 301,不能塞进 HTTPS 的 server 块里混用。











