nginx server块中配置404跳转需error_page、location和权限协同:返回自定义页需error_page 404 /404.html + location = /404.html { root ...; internal; };重定向用error_page 404 = @notfound + location @notfound { return 302 ...; };代理场景须在location内启用proxy_intercept_errors on。

在 Nginx 的 server 块中配置 404 错误跳转,核心是让请求返回自定义页面或重定向到其他地址,而不是默认的 Nginx 错误页。这不是加一行 error_page 就能生效的事,必须配合作用域、拦截开关和路径权限三者协同。
用 error_page 返回本地自定义页面(状态码仍为 404)
适用于希望用户看到友好提示、同时保留 404 状态码的场景(利于 SEO 和调试):
-
在 server 块内写:
error_page 404 /404.html;—— 注意路径是 URI 路径,不是文件系统路径 -
必须配一个 location = /404.html,并指定真实可读的 root:
location = /404.html {<br> root /usr/share/nginx/html;<br> internal;<br>}
其中internal防止用户直接访问/404.html;root拼出的实际路径是/usr/share/nginx/html/404.html,需确保该文件存在且 nginx 进程有读权限(chmod 644,目录chmod 755)
用命名 location 实现 302 临时跳转(URL 改变,状态码变为 302)
适合引导用户到搜索页、首页或兜底页,提升体验:
-
触发内部重定向:
error_page 404 = @notfound;——=表示不改变响应状态码为 404,而是执行后续逻辑 -
定义命名 location:
location @notfound {<br> return 302 /search?q=$request_uri;<br>}
这样用户会跳转到/search?q=/xxx,浏览器地址栏更新,便于后端识别原始请求
反向代理场景下必须开启拦截开关
如果 404 来自后端(如 proxy_pass 到 Flask、VuePress 或 Node.js),Nginx 默认透传状态码,error_page 不生效:
-
在同级 location 块里加:
proxy_intercept_errors on; - error_page 必须写在这个 location 内,不能只放在 server 顶层 —— 否则对代理请求无效
- 若后端是 PHP-FPM,则对应位置要设
fastcgi_intercept_errors on;
常见失效原因与自查点
配完没效果?大概率卡在这几个地方:
-
error_page写在了location /api里,但主站请求走的是location /—— 它只管自己 scope 内的错误 -
location = /404.html的root路径拼出来后文件不存在,或权限不对(尤其注意目录需有x权限) - 用了
alias替代root,在=匹配的 location 中容易路径错位,推荐统一用root - 修改后没重载:运行
nginx -t && nginx -s reload验证语法并生效











