为什么 nginx.conf 中的 return 语句会向浏览器返回纯文本文件位置而不是要呈现的实际文件?

为什么 nginx.conf 中的 return 语句会向浏览器返回纯文本文件位置而不是要呈现的实际文件?

环境:Nginx、Node.js

我正在尝试在 Nginx 中处理错误,但无法返回文件。

在下面简化的情况下,ngxinx.conf如果 httprequest_method不是GETHEAD或者POST我希望服务器返回 405.html 错误页面。

希望输出:405.html 被发送到浏览器。

实际产量:该纯文本被发送到浏览器。 http://www.example.com/html/405.html

注意:我在 Postman 中测试这一点,因此不需要在 Chrome 中安装允许向服务器发送各种 HTTP 方法的附加扩展程序。

我的配置的相关部分:

server {

    include conf.d/listen-80;

    server_name example.com www.example.com;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    return 301 https://www.example.com$request_uri;

}

server {

    include conf.d/listen-443;

    server_name www.example.com;

    include conf.d/letsencrypt;

    if ($request_method !~ ^(GET|HEAD|POST)$) {
        return 405 $scheme://www.example.com/html/405.html;
    }

    root /srv/example/views/public;

    location ~* \.(htm|html)$ {
        include conf.d/content-security-policy-html-rendered;
        include conf.d/cache-control-30-days;
        include conf.d/security-headers-html-rendered;
    }
}

答案1

之后的 URLreturn nnn仅被视为重定向代码(301、302、303、307 和 308 状态代码)的目标 URL。文档没有清楚地说明当代码是其他内容时它会做什么。

要获取您的错误页面,请使用以下命令:

if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 405;
}

error_page 405 /html/405.html;

/html/405.html这将告诉 nginx在返回状态代码 405 时发送。

相关内容