不允许使用Nginx 405方法,即使有JSON响应

不允许使用Nginx 405方法,即使有JSON响应,nginx,nginx-location,Nginx,Nginx Location,我的nginx看起来像 error_page 401 @json401; location @json401 { try_files /errors/401.json; internal; } { "status": 401, "error": "Authorization required.", "detail": "Please log in first before accessing this page." } 我的errors/401.json看起来像 erro

我的nginx看起来像

error_page 401 @json401;
location @json401 {
  try_files /errors/401.json;
  internal;
}
{
  "status": 401,
  "error": "Authorization required.",
  "detail": "Please log in first before accessing this page."
}
我的
errors/401.json
看起来像

error_page 401 @json401;
location @json401 {
  try_files /errors/401.json;
  internal;
}
{
  "status": 401,
  "error": "Authorization required.",
  "detail": "Please log in first before accessing this page."
}
我知道nginx不能为非GET请求返回静态页面,但我正在尝试返回JSON

现在,当我对具有401响应的端点执行POST请求时,仍然会得到一个不允许的405方法(get请求正确返回JSON文件)。我还尝试添加
default_-type应用程序/json
,但仍然得到了405

非常感谢您的帮助。

如果内部重定向期间不需要更改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;
}

如果内部重定向期间不需要更改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;
}