
Среда: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.