Я пытаюсь предоставить страницу обслуживания клиентам, которые запрашивают мое приложение, когда оно находится на обслуживании. Ниже приведена моя конфигурация nginx для этой цели.
server {
recursive_error_pages on;
listen 80;
...
if (-f $document_root/maintenance.html) {
return 503;
}
error_page 404 /404.html;
error_page 500 502 504 /500.html;
error_page 503 @503;
location = /404.html {
root $document_root;
}
location = /500.html {
root $document_root;
}
location @503 {
error_page 405 =/maintenance.html;
if (-f $request_filename) {
break;
}
rewrite ^(.*)$ /maintenance.html break;
}
}
Допустим, я включил обслуживание своего сайта, создав $document_root/maintenance.html
. Этот файл правильно обслуживается, когда пользователь делает запрос с помощью Accept
заголовок text/html
.
$ curl http://server.com/ -i -v -X GET -H "Accept: text/html"
* Adding handle: conn: 0xf89420
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0xf89420) send_pipe: 1, recv_pipe: 0
* About to connect() to server.com port 80 (#0)
* Trying xxx.xxx.xxx.xxx...
* Connected to server.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.33.0
> Host: server.com
> Accept: text/html
>
< HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
* Server nginx/1.1.19 is not blacklisted
< Server: nginx/1.1.19
Server: nginx/1.1.19
< Date: Thu, 14 Nov 2013 11:16:16 GMT
Date: Thu, 14 Nov 2013 11:16:16 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 27
Content-Length: 27
< Connection: keep-alive
Connection: keep-alive
<
This is under maintenance.
* Connection #0 to host server.com left intact
Теперь некоторые клиенты устанавливают Accept
заголовок в application/json
. Как отправить им ответ JSON вместо maintenance.html
?
Ниже приводится ответ, который я получаю при установке Accept
к application/json
.
$ curl http://server.com/ -i -v -X GET -H "Accept: application/json"
* Adding handle: conn: 0x190c430
* Adding handle: send: 0
* Adding handle: recv: 0
* Curl_addHandleToPipeline: length: 1
* - Conn 0 (0x190c430) send_pipe: 1, recv_pipe: 0
* About to connect() to server.com port 80 (#0)
* Trying xxx.xxx.xxx.xxx...
* Connected to server.com (xxx.xxx.xxx.xxx) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.33.0
> Host: server.com
> Accept: application/json
>
< HTTP/1.1 503 Service Temporarily Unavailable
HTTP/1.1 503 Service Temporarily Unavailable
* Server nginx/1.1.19 is not blacklisted
< Server: nginx/1.1.19
Server: nginx/1.1.19
< Date: Thu, 14 Nov 2013 11:15:50 GMT
Date: Thu, 14 Nov 2013 11:15:50 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 27
Content-Length: 27
< Connection: keep-alive
Connection: keep-alive
<
This is under maintenance.
* Connection #0 to host server.com left intact
Попробуйте использовать карту
map $http_accept $maintenance_page {
default /maintenance.html;
~application/json /maintenance.json;
}
Затем замените /main maintenance.html на $ maintenance_page
Подробнее о http://nginx.org/en/docs/http/ngx_http_map_module.html
Вы можете попробовать следующее подходить
Основная идея - проверить тип содержимого запроса и вернуть страницу в соответствии с ним.