Метод Nginx 405 не разрешен, даже с ответом JSON - PullRequest
0 голосов
/ 18 октября 2019

Мой nginx выглядит как

error_page 401 @json401;
location @json401 {
  try_files /errors/401.json;
  internal;
}

А мой errors/401.json выглядит как

{
  "status": 401,
  "error": "Authorization required.",
  "detail": "Please log in first before accessing this page."
}

Я понимаю, что nginx не может вернуть статическую страницу для запросов без GET, но япытаясь вернуть JSON.

Теперь, когда я делаю POST-запрос к конечной точке с ответом 401, я все равно получаю метод 405 Not Allowed (GET-запросы правильно возвращают JSON-файл). Я также попытался добавить default_type application/json, но все равно получаю 405.

Помощь приветствуется.

1 Ответ

1 голос
/ 18 октября 2019

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."
}
...