Linux下Nginx统一处理错误请求分两类:返回静态错误页(如error_page 404 /error/404.html,保持原状态码)或301跳转(需error_page 404 = @redirect_404配合internal命名location)。
在 Linux 上用 Nginx 实现“所有错误请求统一重定向”,核心是区分两类需求:一类是返回统一错误页面(如 404.html),另一类是把错误请求真正跳转到新 URL(比如 301 跳首页)。两者写法不同,不能混用。
这是最常用、最安全的做法:保持原始状态码(如 404 仍是 404),但展示同一套友好页面。只需在 http 块 中配置一次,全站生效:
root /usr/share/nginx/html;
error_page 404 /error/404.html;error_page 500 502 503 504 /error/5xx.html;error_page 403 /error/403.html;
/usr/share/nginx/html/error/404.html
如果确实需要把所有错误请求(比如全部 404)都跳到 https://example.com/,必须用命名 location 中转,不能直接 return:
error_page 404 = @redirect_404;(注意 = 符号,表示内部跳转并重置状态码)location @redirect_404 {internal;return 301 https://example.com/;}
internal 防止用户直接访问 @redirect_404 导致绕过逻辑error_page 404 500 502 503 504 = @redirect_error;
实际配置中容易出错的点:
return 301 直接写在 error_page 后面——语法错误,Nginx 启动失败=,写成 error_page 404 @notfound; → 只会内部重定向到 location,但状态码不变,不是跳转rewrite ... permanent → 可能触发 rewrite cycle 循环错误改完配置后别忘了:
nginx -t 检查语法是否正确systemctl reload nginx(或 nginx -s reload)热加载curl -I http://your-domain.com/nonexistent-path,看响应头是否为 404 + 正确 body,或 301 + Location 头