https://nginx.org/en/docs/http/ngx_http_core_module.html#error_page
Если нет необходимости изменять URI и метод во время внутреннего перенаправления , можно передать обработку ошибок в именованное местоположение:
Итак, когда вы используете именованное местоположение, он получает тот же метод, что и исходное местоположение (POST), а try_files
принимает только метод GET, таким образом, вы получаете 405.
Вы должны использоватьобычное (неименованное) местоположение, потому что в этом случае любой метод будет заменен на GET:
Это приведет к внутреннему перенаправлению на указанный uri с методом запроса клиента, измененным на «GET»(для всех методов, кроме «GET» и «HEAD») .
Следующий пример работает, как вы ожидали:
error_page 401 /json401;
location /json401 {
internal;
default_type application/json;
try_files /errors/401.json =401;
}
location = /test {
return 401;
}
$ curl -X POST http://localhost:9999/test -sD -
HTTP/1.1 401 Unauthorized
...
Content-Type: application/json
Content-Length: 120
Connection: close
...
{
"status": 401,
"error": "Authorization required.",
"detail": "Please log in first before accessing this page."
}