Come posso restituire uno stato 503 in apache senza invocare script esterni


26

Devo restituire un codice di stato 503 da uno dei miei siti mentre è inattivo per manutenzione, nel tradizionale modo SE_firendly. Non riesco a capire come farlo senza invocare script esterni, che preferirei evitare.

Esiste una direttiva apache che mi permetterà di restituire un codice di stato HTTP arbitrario senza ricorrere a hack come invocare uno script php che imposta l'intestazione dello stato?


2
Non sono del tutto sicuro che l'esecuzione di un file PHP si classifichi come un "hack" ... è un po 'esattamente quello che un web server è progettato per fare ...
Mark Henderson

3
Hm. Penso che invocare un intero linguaggio di script interpretato per impostare una singola riga della risposta del server si qualifichi come hack. L'impostazione di linee di intestazioni di risposta senza soluzioni alternative elaborate mi sembra più vicina a ciò che i server Web sono stati progettati per fare.
dan mackinlay,

Risposte:


32

Questo serve ad ogni richiesta una pagina di mantenimento statica insieme allo stato 503.

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

RedirectMatch viene utilizzato per negare la pagina di mantenimento stessa che altrimenti creerebbe un ciclo infinito.

mod_header viene utilizzato per impostare un'intestazione Retry-After in modo da poter dire a Google / altri bot ecc. che in questo esempio è necessario eseguire il backup dopo 18000 secondi (5 ore). È possibile sudo ap2enmod headerattivare mod_header (richiesto per la direttiva Header).


2
+1: un commento a margine: puoi solo aggiungere [RedirectMatch 503. *] E le [Header set sempre Retry-After "18000"] regole e funziona con il messaggio di errore 503 predefinito. Controlla il file conf.d / localized-error-pages per impostare un messaggio diverso per le diverse lingue (che richiedono negoziazione, alias e moduli inclusi).
lepe,

Funziona! Per il mio sito Web personale, utilizzo RedirectMatch 503 ^/(?!\.Error/.*|dragonlord-bg\.jpg).
bwDraco,

7

Provare

Redirect 503 / /

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

Altri codici di stato possono essere restituiti fornendo il codice di stato numerico come valore di stato. Se lo stato è compreso tra 300 e 399, l'argomento URL deve essere presente, altrimenti deve essere omesso. Si noti che lo stato deve essere noto al codice Apache (vedere la funzione send_error_response in http_protocol.c).

Nota aggiuntiva: Questo visualizzerà il Documento di errore predefinito / configurato per l'errore 503.


Grazie David. mod_alias non è dove mi aspettavo di trovare quella risposta, ma sembra fare il lavoro.
dan mackinlay,

sì, Redirect non è proprio il verbo giusto per quello che stai facendo :)
David Pashley il

Nel reindirizzamento 503 manca un argomento URL-path, che è sempre obbligatorio. L'URL invece deve essere omesso se il codice reindirizzato non è 300-399

1
Viene visualizzato un errore nel modo seguente: "Il reindirizzamento accetta due o tre argomenti, uno stato facoltativo, quindi il documento da reindirizzare e l'URL di destinazione", è possibile fornire un esempio più completo nel contesto?
Tom,

4
Redirect 503 /sembra funzionare.
mpartel,

0

Per rendere più flessibile la modalità di manutenzione, impostare 503 quando esiste un file speciale, ala:

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

NOTA: la posizione di DOCUMENT_ROOT può variare tra httpd 2.2 e 2.4

In questo modo è sufficiente "toccare /path/to/docroot/.Manutenzione" e il tuo sito inizierà immediatamente a restituire 503. Quindi, per rendere tutto pury, crea una pagina di errore html personalizzata ben formattata e aggiungila al file di configurazione del server apache corretto:

ProxyErrorOverride on
ErrorDocument 503 /error/503.html

E per i punti bonus se disponi di più server Web, esegui la posizione di .manutenzione su un filesystem condiviso o per ancora più punti bonus:

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

Il vantaggio di rendere basato il file della modalità di manutenzione è che funziona quando l'applicazione non lo fa, è semplice e veloce, ed è più facile da gestire per un proxy di cache di frontend perché puoi gestire tutti i 503 back-end in un colpo solo.

fonti:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.