nginx自定义404页面需同时满足四条件:1. error_page 404 /404.html置于server块且配合proxy_intercept_errors或fastcgi_intercept_errors;2. 404.html文件≥512字节、权限644、路径正确;3. 显式配置location = /404.html { root ...; internal; };4. 确保mime类型识别正常并执行nginx -t校验。

直接在 Nginx 里配自定义 404 页面,不是加一行 error_page 就完事。它得同时满足四个硬性条件:配置位置对、拦截开关开、文件路径准、文件大小够——缺一不可,否则你看到的还是白页、默认提示或浏览器兜底页。
1. 正确写 error_page 并放在生效作用域
必须把 error_page 404 /404.html; 写在 server 块里(不推荐放 http 全局块,容易覆盖难调试),且不能嵌套在某个子 location 中(比如 location /api/ 里),否则只对该路径下的 404 生效。
- 静态资源 404(如访问
/missing.css):server 级配置即可生效 - 反向代理后端返回 404(如 proxy_pass 到 Node.js):必须在同一
location块内加proxy_intercept_errors on; - PHP-FPM 返回 404:在
http或对应server块加fastcgi_intercept_errors on;
2. 创建真实可读的 404.html 文件
假设你的 root /var/www/html;,那就把 404.html 放到 /var/www/html/404.html。注意两个关键点:
- 文件内容必须 ≥512 字节(浏览器兼容需要),可用命令快速补足:
echo '<h1>Page Not Found</h1> <!-- '"$(printf 'x%.0s' {1..500})"' -->' > /var/www/html/404.html - 权限设为
644,目录设为755,确保 Nginx worker 用户(如www-data或nobody)能读取
3. 显式声明 location = /404.html 并加 internal
仅靠 error_page 不会自动服务这个文件,必须单独定义如何响应它:
- 用
location = /404.html { root /var/www/html; internal; }——=表示精确匹配,internal防止用户直接访问/404.html - 别用
alias,尤其对=匹配,容易路径错位;root是拼接基准,更稳 - 确保该
location块里的root和前面 server 的root一致,或明确指向含404.html的物理路径
4. 检查 MIME 类型与配置语法
如果页面显示为下载而不是渲染,大概率是 MIME 类型没识别:
- 确认主配置中有
include mime.types;(默认 nginx.conf 已含) - 若仍不行,可在
location = /404.html块内显式声明:types { text/html html; } - 每次改完都执行
nginx -t校验,再nginx -s reload重载











