基于accept标头的nginx错误页面不适用于json请求

问题描述

我正在尝试构建一个基于nginx的维护模式应用程序,该应用程序捕获对我的应用程序的所有请求,并以503返回预定义的响应。

我目前有一些请求json响应的应用程序,以及使用浏览器访问页面的用户。因此,如果请求包含标头Accept: application/json,我想用json文件maintenance.json的内容来响应,否则要用html文件maintenance.html来响应。

我当前的nginx配置如下:

server {
    listen  8080;
    root   /usr/share/nginx/maintenance;
    server_tokens off;

    error_page 503 = @unavailable;

    location ^~ / {
      return 503;
    }

    location @unavailable {
      set $maintenanceContentType text/html;
      set $maintenanceFile /maintenance.html;
      if ($http_accept = 'application/json') {
        set $maintenanceContentType application/json;
        set $maintenanceFile /maintenance.json;
      }

      default_type $maintenanceContentType;
      try_files $uri $maintenanceFile;
    }
}

对于浏览器对任何路径的请求,都可以正常工作:“ https://maintenance.my-domain.local/some-path”。我得到了响应代码和html内容。

但是对于标题为Accept: application/json的请求,我会得到一个404 HTML页面。并且nginx日志显示 [错误] 21#21:* 1 open()“ / usr / share / nginx / maintenance / some-path”失败(2:无此类文件或目录),客户端:10.244.2.65 ,服务器:,请求:“ GET / asd HTTP / 1.1”,主机:“ maintenance.my-domain.local”

由于某种原因,似乎json请求忽略了我的location。当我删除设置适当文件的指令并始终返回html时,这也适用于 json-requests

有人知道吗?

我不一定要为此特定配置寻找修复程序,而是要寻找适合我需要的基于Accept标头响应不同“错误页面”的内容。

谢谢!

编辑:由于某种原因,这现在导致HTTP 200而不是503。不知道我做了什么更改。.

EDIT2:设法修复了其中的一部分:

server {
    listen  8080;
    root /usr/share/nginx/maintenance;
    server_tokens off;

    location ^~ / {
      if ($http_accept = 'application/json') {
        return 503;
      }
      try_files /maintenance.html =404;
    }

    error_page 503 /maintenance.json;
    location = /maintenance.json {
      internal;
    }

}

通过此配置,现在我在定义标题Accept: application/json时使用浏览器和维护json时获得维护页面。浏览器的响应代码现在为200 ...

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)