2013-04-23 16 views
6

Ho un semplice file di configurazione che viene utilizzato per la pagina di errore 503 personalizzata del server al momento della manutenzione. La parte rilevante è questo:Restituisce 503 per la richiesta POST in Nginx

server { 
    listen  80 default; 
    root  /usr/share/nginx/html; 
    server_name example.com; 

    location/{ 
     if (-f $document_root/503.json) { 
      return 503; 
     } 
    } 

    # error 503 redirect to 503.json 
    error_page 503 @maintenance; 
    location @maintenance { 
     rewrite ^(.*)$ /503.json break; 
    } 
} 

Il problema è Nginx capisce che qualsiasi richiesta si risolve in un file statico e qualsiasi POST, PUT e DELETE richieste ottengono 405 (metodo non consentito) di risposta.

Quindi la domanda è: come posso dire a Nginx di servire la mia pagina per qualsiasi metodo HTTP?

+1

Ti è venuta una soluzione? –

risposta

3

mi sono imbattuto in questo oggi. Sembra che il problema sia dovuto a nginx (come la maggior parte dei server) che non ti permette di convertire POST in un file statico.

La soluzione è di acquisire 405 errori nel blocco di posizione @ 503, che serve la pagina di manutenzione. Inoltre, si dovrà attivare @ recursiveerrorpages @, dal momento che sono in primo luogo, volutamente, gettando un errore di 503, e quindi l'utente sta gettando un 405 inviando al file statico:

recursive_error_pages on; 

if (-f $document_root/system/maintenance.html) { 
    return 503; 
} 

error_page 404 /404.html; 
error_page 500 502 504 /500.html; 
error_page 503 @503; 
location @503 { 

    error_page 405 = /system/maintenance.html; 

    # Serve static assets if found. 
    if (-f $request_filename) { 
    break; 
    } 

    rewrite ^(.*)$ /system/maintenance.html break; 
} 

Fonte: https://www.onehub.com/blog/2009/03/06/rails-maintenance-pages-done-right/

+0

il codice di stato restituito alla richiesta di posta in questo caso sarà comunque un 405 in questo caso, corretto? –

+0

@MohamedHafez no, dovrebbe restituire un 503. È spiegato completamente nell'articolo sorgente collegato, ma dalla memoria si sta reindirizzando alla pagina di manutenzione e quindi si lancia esplicitamente un 503 – Jay

0

Forse provare a forzare le 405 richieste di essere l'attuale URI:

error_page 405 = $uri; 
+0

Non sai cosa intendi. Risultati URI effettivi in ​​405. Voglio 503. – cababunga

+0

Vedere questo se funziona error_page 405 = 503/50x.html; –