要在 nginx 反向代理中拦截后端 404 并展示美化页面,必须同时开启 proxy_intercept_errors、在同 location 块配置 error_page 404 = /404.html,并确保静态页存在、≥512 字节、受 internal 保护且有读取权限。

要在 Nginx 反向代理中拦截后端返回的 404 错误并展示统一美化的页面,关键不是只加一行 error_page,而是确保拦截机制开启、路径可访问、状态码保留这三件事都到位。
必须启用 proxy_intercept_errors
Nginx 默认会把后端返回的 404 直接透传给浏览器,不走本地错误页。要让它“接管”,必须在对应作用域开启拦截开关:
- 写在
location块内最稳妥(尤其当该 location 负责反向代理) - 示例:
proxy_intercept_errors on; - 不能只写在
http或server块——如果 location 没继承或没显式开启,仍不生效
error_page 指令要放在正确位置
error_page 404 /404.html; 必须和 proxy_pass 在同一个 location 块里,否则对代理请求无效:
- 错误写法:把
error_page放在server块,但proxy_pass在子location中 - 正确写法:
location / {<br> proxy_pass http://backend;<br> proxy_intercept_errors on;<br> error_page 404 = /404.html;<br>} -
=表示保持原始 404 状态码,避免被改成 200
美化页面需满足基础条件
即使配置全对,页面也未必能显示。以下四点缺一不可:
- 静态文件真实存在,且 Nginx 有读取权限(如
/usr/share/nginx/html/404.html) - 文件大小 ≥512 字节(小文件可能触发浏览器兜底页)
- 用
internal保护错误页,防止被直接访问:location = /404.html {<br> root /usr/share/nginx/html;<br> internal;<br>} - 建议加缓存控制头,方便调试:
add_header Cache-Control "no-cache";
按路径差异化响应(可选增强)
面向用户页面和 API 接口可以返回不同格式:
- Web 页面路径(如
/,/about)返回 HTML:error_page 404 = /404.html; - API 路径(如
/api/开头)返回 JSON:location ^~ /api/ {<br> proxy_pass http://api_backend;<br> proxy_intercept_errors on;<br> error_page 404 =404 /api-404.json;<br>} -
/api-404.json内容示例:{"code":404,"message":"Not found"}











