我正在尝试构建一个基于 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 日志显示[error] 21#21: *1 open() "/usr/share/nginx/maintenance/some-path" failed (2: No such file or directory), client: 10.244.2.65, server: ,请求:“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;
}
}
有了这个配置,我现在在使用浏览器和维护 json 时得到维护页面,在定义 header 时Accept: application/json
。浏览器响应代码现在是 200...