nginx:error_page 指令被静默忽略

Der*_*key 9 nginx custom-errors

我正在尝试为 nginx 中的非 HTTPS 请求返回自定义 400 错误页面。我是 nginx 的新手,但我在自定义错误页面上阅读了许多示例页面,但似乎对我没有任何作用。我的配置:

server {
    listen 80;

    error_page 400 /400.html;
    location = /400.html {
        root /var/www/html;
    }

    return 400;
}
Run Code Online (Sandbox Code Playgroud)

返回工作,因为如果我改变代码(如401或500),我得到了适当的默认nginx的错误页面。我知道该文件存在,因为如果我取出退货,它将直接为我的 400.html 页面提供服务,没有任何问题。但是当我返回错误代码时,我尝试过的任何事情都没有导致我的自定义页面出现。

我错过了什么?

更新:我尝试过的其他变体无济于事:

server {
    listen 80;

    error_page 400 /400.html;
    location = /400.html {
        root /var/www/html;
    }

    return 400;
}

server {
    listen 80;

    root /var/www/html;

    error_page 400 /400.html;
    location = /400.html {
        allow all;
    }

    return 400;
}

server {
    listen 80;

    root /var/www/html;
    error_page 400 /400.html;

    return 400;
}
Run Code Online (Sandbox Code Playgroud)

Der*_*key 9

我在 Stackoverflow 上发现了这个问题,它完成了我一直在寻找的问题。

我猜无论出于何种原因,即使返回服务器块内工作,它也不尊重任何error_page指令。这可能是一个错误,或者我不明白的故意行为。解决方案是将return放在location块中:

server {
    listen 80;

    root /var/www/html;

    error_page 400 /400.html;
    location = /400.html {
        internal;
    }

    location / {
        return 400;
    }
}
Run Code Online (Sandbox Code Playgroud)