nginx 不会在文档根目录的子目录中提供 error_page

Bra*_*dan 5 nginx custom-errors

这是我的 nginx 配置的一个片段:

server {
    error_page 500 /errors/500.html;
}
Run Code Online (Sandbox Code Playgroud)

当我在我的应用程序中导致 500 时,Chrome 只显示其默认的 500 页面(Firefox 和 Safari 显示空白页面)而不是我的自定义错误页面。

我知道该文件存在,因为我可以访问http://server/errors/500.html并看到该页面。我还可以将文件移动到文档根目录并将配置更改为:

server {
    error_page 500 /500.html;
}
Run Code Online (Sandbox Code Playgroud)

并且 nginx 正确地提供页面,所以它似乎不是服务器上配置错误的其他东西。

我也试过:

server {
    error_page 500 $document_root/errors/500.html;
}
Run Code Online (Sandbox Code Playgroud)

和:

server {
    error_page 500 http://$http_host/errors/500.html;
}
Run Code Online (Sandbox Code Playgroud)

和:

server {
   error_page 500 /500.html;
   location = /500.html {
       root /path/to/errors/;
   }
}
Run Code Online (Sandbox Code Playgroud)

没有运气。

这是预期的行为吗?错误页面是否必须存在于文档根目录中,或者我是否遗漏了一些明显的内容?


更新 1:这也失败了:

server {
    error_page 500 /foo.html;
}
Run Code Online (Sandbox Code Playgroud)

何时foo.html确实存在于文档根目录中。似乎其他东西正在覆盖我的配置,但此块是唯一/etc/nginx/*引用该error_page指令的地方。

还有其他地方可以设置nginx配置吗?

And*_*sov 5

尝试添加

proxy_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)

或者

fastcgi_intercept_errors on;
Run Code Online (Sandbox Code Playgroud)

在服务器块中,具体取决于您的配置。

这种配置工作正常:

  error_page   500 502 503 504  /500.html;
    location = /500.html {
        root   /home/static/pages;
    }
Run Code Online (Sandbox Code Playgroud)

  • 答案通常是正确的,但使用的确切指令可能因使用的后端协议而异。例如,对于 fastcgi 应用程序,它将是 [fastcgi_intercept_errors](http://nginx.org/r/fastcgi_intercept_errors)。 (2认同)