nginx配置404页面需同时满足三条件:error_page指令置于正确作用域(server或同级location)、proxy_intercept_errors或fastcgi_intercept_errors开启、location = /404.html的root路径真实可读且加internal;否则将返回空白或默认错误页。

直接上结论:Nginx 配置 404 页面不是“加一行 error_page 就完事”,关键在三处——error_page 指令位置、proxy_intercept_errors(或 fastcgi_intercept_errors)是否开启、以及 location = /404.html 的 root 路径是否真实可读。漏掉任意一个,页面就 404 不出来,或者返回空白/原始 Nginx 错误页。
error_page 必须写在能生效的作用域里
error_page 可以放在 http、server 或 location 块中,但实际生效取决于请求匹配路径和错误来源:
- 静态文件 404(比如访问
/abc.html但文件不存在):写在server或location都行,优先匹配最近的error_page - 反向代理后端返回 404(比如
proxy_pass到 VuePress 或 Flask 服务):必须在同级location块内启用proxy_intercept_errors on,否则 Nginx 默认透传后端状态码,不触发本地error_page - PHP-FPM 返回 404:需在
http块或对应server块中设置fastcgi_intercept_errors on - 不要把
error_page 404 /404.html写在location /api这类子路径里——它只对该 location 内产生的 404 生效,主站 404 仍走默认页
location = /404.html 的 root 路径必须绝对且可读
很多人配完发现返回 404 页面时又报 403 或空白,问题几乎都出在这里:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
-
root值是拼接路径的基准,不是完整路径。例如root /static-url/error-html;+location = /404.html→ 实际查找文件为/static-url/error-html/404.html - 确保该路径存在:
ls -l /static-url/error-html/404.html,且 Nginx worker 进程(通常是www-data或nginx用户)有读权限:chmod 644 /static-url/error-html/404.html;目录需有执行权限:chmod 755 /static-url/error-html - 加
internal;是推荐做法,防止用户直接访问/404.html(比如输错 URL 访问到这个地址本身):location = /404.html {<br> root /static-url/error-html;<br> internal;<br>} - 别用
alias替代root——alias对=匹配的 location 容易出路径错位,root更稳
跳转外部 URL 或改写状态码要小心语法
想把 404 引导到百度或自己另一个域名?注意 error_page 的等号用法:
-
error_page 404 http://baidu.com;→ 302 临时跳转,浏览器地址栏会变,不推荐用于 SEO -
error_page 404 =301 http://example.com/404/;→ 显式指定 301 永久跳转,适合迁移场景 -
error_page 404 =200 /404.html;→ 关键!加=200表示返回 200 状态码,但内容是 404 页面。对单页应用(SPA)友好,避免前端路由被搜索引擎判为死链 - 不要写
error_page 404 = /404.html(缺状态码)——Nginx 会默认返回 404 状态,页面虽显示但 HTTP 状态仍是 404,不利于调试和监控
最常被忽略的是拦截开关:反向代理场景下,proxy_intercept_errors off(默认值)会让所有后端错误原样透传,error_page 形同虚设。上线前务必用 curl -I http://your-domain/xxx-nonexist 验证返回的状态码和 body 是否符合预期——状态码是 404 还是 200,body 里有没有你写的 HTML 文本,比配置文件多看两眼更管用。










