Nginx 的 error_page 404 /404.html 触发内部重定向,需配合 location = /404.html { internal; root /usr/share/nginx/html; } 处理,确保文件存在且权限正确,并避免外部直接访问或资源路径错误。

在 Nginx 的 server 块中使用 error_page 指令,可以将 404 状态重定向到自定义页面(如 /404.html),但要注意:它不是简单地“返回”该文件,而是触发一次内部重定向,需配合 location 块处理路径解析。
基本配置写法
在 server 块内添加:
error_page 404 /404.html;
这行表示:当发生 404 时,Nginx 内部跳转到 URI /404.html(注意是 URI,不是文件路径)。接下来必须确保该 URI 能被正确响应,通常靠下面的 location 匹配。
必须配合 location 块提供静态响应
仅写 error_page 不够,Nginx 需要知道如何响应 /404.html 这个请求。推荐用 location = /404.html 显式匹配:
- location = /404.html { internal; root /usr/share/nginx/html; }
-
internal表示该 location 只能被内部重定向访问(防止用户直接请求/404.html暴露路径) -
root指定文件根目录,Nginx 会拼接为/usr/share/nginx/html/404.html - 确保该 HTML 文件真实存在且有读取权限
常见错误与避坑点
- 漏写
location块 → 请求卡住或返回空页/默认 404 - 用
alias时末尾斜杠不匹配:比如alias /var/www/error/;对应/404.html,则文件路径是/var/www/error/404.html;若写成alias /var/www/error(缺斜杠),结果会出错 - 自定义页面含相对路径资源(如
css/style.css)→ 浏览器仍按原 URL(如/abc/xyz)解析,导致样式丢失;建议用绝对路径(/css/style.css)或<base href="/> - 未设
internal→ 外部可直访/404.html,可能暴露错误页结构或影响 SEO
进阶:统一错误页 + 状态码透传
如果想让所有错误页共用一个 HTML 并保留原始状态码(如仍返回 404 而非 200),可这样写:
error_page 404 /error.html?code=404;
location = /error.html { internal; root /usr/share/nginx/html; }
在 error.html 中用 JS 或服务端逻辑读取 code 参数动态渲染内容。注意:Nginx 本身不解析 HTML,状态码仍需靠 error_page 触发时保持原样(默认即保持)。


















