Como posso retornar um status 503 no apache sem chamar scripts externos

26

Preciso retornar um código de status 503 de um dos meus sites enquanto estiver em manutenção, da maneira SE_firendly. Parece que não consigo descobrir como fazer isso sem chamar scripts externos, o que prefiro evitar.

Existe uma diretiva apache que me permita retornar um código de status HTTP arbitrário sem recorrer a hacks, como invocar um script php que define o cabeçalho do status?

dan mackinlay
fonte
2
Eu não estou completamente certo que a execução de um arquivo PHP classifica como um "hack" ... que é uma espécie de exatamente o que um servidor web é projetado para fazer ...
Mark Henderson
3
Hum. Acho que invocar uma linguagem de script interpretada inteira para definir uma única linha da resposta do servidor se qualifica como hack. Definir linhas de cabeçalhos de resposta sem soluções elaboradas parece-me mais próximo do que os servidores da Web foram projetados para fazer.
dan Mackinlay

Respostas:

32

Isso atende a cada solicitação uma página de retenção estática junto com o status 503.

RedirectMatch 503 ^/(?!holding\.html)
ErrorDocument 503 /holding.html
Header always set Retry-After "18000"

RedirectMatch é usado para negar a própria página de espera que, de outra forma, criaria um loop infinito.

O mod_header é usado para definir um cabeçalho Retry-After para que você possa informar ao Google / outros bots etc. que você deve fazer backup após 18000 segundos (5 horas) neste exemplo. Você pode sudo ap2enmod headerativar o mod_header (necessário para a diretiva Header).

muffinresearch
fonte
2
+1: Um comentário secundário: você pode adicionar apenas [RedirectMatch 503. *] E as regras [Header sempre defina Nova tentativa após "18000"] e ele funciona com a mensagem de erro 503 padrão. Verifique o arquivo conf.d / localized-error-pages para definir uma mensagem diferente para diferentes idiomas (esses requerem negociação, alias e incluem módulos).
Lepe
Funciona! Para o meu site pessoal, eu uso RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
precisa saber é o seguinte
7

Experimentar

Redirect 503 / /

Em http://httpd.apache.org/docs/2.2/mod/mod_alias.html#redirect :

Outros códigos de status podem ser retornados, fornecendo o código numérico de status como o valor do status. Se o status estiver entre 300 e 399, o argumento da URL deverá estar presente, caso contrário, deverá ser omitido. Observe que o status deve ser conhecido pelo código do Apache (consulte a função send_error_response em http_protocol.c).

Nota adicional: Isso exibirá o ErrorDocument padrão / configurado para o erro 503.

David Pashley
fonte
Obrigado david. O mod_alias não é onde eu esperava encontrar essa resposta, mas parece fazer o trabalho.
dan Mackinlay
sim, Redirect não é realmente o verbo certo para o que você está fazendo :)
David Pashley
No redirecionamento 503, está faltando um argumento, caminho da URL, que é sempre obrigatório. O URL, por outro lado, deve ser omitido se o código redirecionado não for 300-399
1
Recebo um erro ao fazer o seguinte: "O redirecionamento leva dois ou três argumentos, um status opcional e depois o documento a ser redirecionado e o URL de destino", você pode dar um exemplo mais completo no contexto?
Tom
4
Redirect 503 /parece funcionar.
Mpartel
0

Para tornar seu modo de manutenção mais flexível, configure 503 quando existir um arquivo especial, ala:

RewriteEngine on
RewriteCond %{DOCUMENT_ROOT}/.maintenance -f
RewriteRule .* - [R=503]

NOTA: A localização de DOCUMENT_ROOT pode diferir entre httpd 2.2 e 2.4

Dessa forma, tudo o que você precisa fazer é "tocar em /caminho/para/docroot/.maintenance" e seu site começará a retornar 503 instantaneamente. Em seguida, para facilitar tudo, crie uma página de erro html bem formatada e personalizada e adicione-a ao arquivo de configuração do servidor apache correto:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

E para pontos de bônus, se você tiver vários servidores da Web, localize .maintenance em um sistema de arquivos compartilhado ou para obter ainda mais pontos de bônus:

pdsh -w $web1_ip,$web2_ip,$web3_ip "sudo touch /path/to/docroot/.maintenance"

A vantagem de criar o arquivo no modo de manutenção é que ele funciona quando o aplicativo não é, é rápido e simples e é mais fácil para um proxy de cache de front-end, porque você pode lidar com todos os 503 de back-end de uma só vez.

Fontes:

Phil
fonte