2011-11-23 2 views
15

Per scopi SEO, vorremmo cambiare il codice di stato HTTP restituito quando la macchina backend dietro nginx va giù per qualche motivo.È possibile modificare il codice di stato HTTP restituito quando il gateway proxy_pass è inattivo in nginx?

Vogliamo cambiarlo in "503 Servizio non disponibile". Oltre a fornire un'intestazione Retry-After per indicare a Google/Bing che la richiesta dovrebbe essere ritentata in X numero di secondi.

E 'possibile via nginx?

Non sto parlando di una pagina di errore personalizzata, ma piuttosto del codice di stato restituito nell'intestazione.

risposta

29

Penso che tu sia devi impostare una pagina di errore specifica, tuttavia è possibile ottenere quello che stai cercando se lo fai. Prova questo:

location/{ 
    proxy_pass http://backend; 
    proxy_intercept_errors on; 
    error_page 502 503 504 =503 @proxyisdown; # always reply with 503 
} 

location @proxyisdown { 
    add_header Retry-After 500; 
    index my_pretty_error_page.html; 
} 

Se si lavora in questo modo si dovrebbe essere in grado di restituire il 503 (che è la parte =503 della direttiva error_page) e riprovare dopo intestazioni con il vantaggio che i visitatori riceveranno un ben formattata "oops, stiamo attualmente riscontrando problemi, riprova tra qualche minuto" invece di una pagina vuota "503 non sai davvero cosa significa" pagina. :)

+0

lo proveremo più tardi oggi. avrei dovuto essere più chiaro nella domanda, verrà usata anche una pagina di errore personalizzata ... è solo che sappiamo come farlo, semplicemente non sapevamo come cambiare il codice di stato/aggiungere l'intestazione retry-after. in ogni caso, torneremo entro 12 ore e ti farò sapere cosa ci viene in mente. detto questo, questo sembra esattamente quello che stiamo cercando :) thx. –

+0

Aggiornamento della risposta per dare maggiore chiarezza sulla restituzione del codice di errore richiesto. –

+1

Tutto funziona come previsto. Tranne che add_header non è supportato da una risposta 503 in nginx. Controlla http://forum.nginx.org/read.php?2,3727 per maggiori informazioni. –

2

Nome vostra pagina di errore /500.html e:

error_page 400 404 500 502 504 =503 /500.html; 

# Optional if your public root is set above and the same for error pages, 
# I sometimes please them outside the app, which is why I'm including it. 
location /500.html { 
    root /path/to/public; 
} 

dovrebbe funzionare come bene e sembra un po 'più semplice per me. Nota: non supporta neanche l'intestazione.