Eu tenho uma configuração nginx para um aplicativo web PHP e gostaria de fazer com que ela sirva a um propósito adicional, e não consigo encontrar uma maneira de realizá-lo. Minha configuração atual do nginx faz o seguinte:
/
e /intro/*
para páginas HTML estáticas para um site de "marketing" não acionado por PHP /maintenance.html
se presente no disco, que só existe durante as implementações /maintenance.html
não existe, envia solicitações para o PHP via FastCGI O resultado final é que as páginas estáticas permanecem disponíveis durante as implantações, e o aplicativo PHP de back-end pode ser interrompido para manutenção enquanto as implementações acontecem. A parte importante do bloco server
config se parece com:
rewrite ^/$ /marketing/index.html last;
rewrite ^/intro/(.*)$ /marketing/$1.html last;
try_files $uri /maintenance.html @webapp;
location @webapp
{
rewrite ^(.*)$ /index.php?url=$1 last;
}
include php.conf;
( php.conf
config processa location ~ \.php$
locais e faz toda a configuração usual de fastcgi_param
. Não há nada específico para o projeto, por isso não postei esse bloco.)
O que eu gostaria de poder fazer além do descrito acima é quando o "modo de manutenção" está ativado, atende /maintenance.html
para solicitações HTTP padrão, mas responde com algum JSON ao manipular solicitações AJAX. Descobri que posso devolver com segurança conteúdo rudimentar ao fazer:
if ($http_x_requested_with = XMLHttpRequest)
{
return 503 '{"maintenance":true}';
}
No entanto, isso obviamente acontece com todas solicitações, não apenas aquelas em que /maintenance.html
está sendo exibido. Parece que vou precisar de alguma bandeira em algum lugar, já que try_files
não permite que você faça coisas adicionais, dependendo do arquivo ou local selecionado.
Existe alguma maneira de o nginx ser configurado para retornar detalhes do modo de manutenção HTML e JSON?
Editar: Pensando mais nisso, seria interessante mover maintenance.html
de try_files
completamente, para que ele possa ser exibido com um status 503 em vez de 200.