Почему оператор return в nginx.conf может возвращать браузеру простое текстовое местоположение файла вместо фактического файла для рендеринга?

Почему оператор return в nginx.conf может возвращать браузеру простое текстовое местоположение файла вместо фактического файла для рендеринга?

Среда:Nginx, Node.js

Я экспериментирую с обработкой ошибок в Nginx, но не могу вернуть файлы.

В упрощенном примере ngxinx.confниже, если http request_methodне является GET, HEADили 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

URL после return nnnобрабатывается только как целевой URL для кода перенаправления (коды статуса 301, 302, 303, 307 и 308). В документации четко не указано, что он делает, когда код представляет собой что-то другое.

Чтобы получить страницу с ошибкой в ​​вашем случае, используйте следующее:

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

error_page 405 /html/405.html;

Это сообщит nginx о необходимости отправки /html/405.htmlпри возврате кода состояния 405.

Связанный контент