Pagina di errore personalizzata 503 con vernice


Risposte:


13

Le FAQ di Varnish suggeriscono di usare vcl_error per questo (ed è come l'ho fatto):

Questo è il VCL predefinito per la pagina di errore:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";

    synthetic {"
        <?xml version="1.0" encoding="utf-8"?>
        <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
            "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
        <html>
            <head>
                <title>"} obj.status " " obj.response {"</title>
            </head>
            <body>
                <h1>Error "} obj.status " " obj.response {"</h1>
                <p>"} obj.response {"</p>
                <h3>Guru Meditation:</h3>
                <p>XID: "} req.xid {"</p>
                <address><a href="http://www.varnish-cache.org/">Varnish</a></address>
            </body>
        </html>
    "};
    return(deliver);
}

se si desidera una versione personalizzata, è sufficiente sovrascrivere la funzione nella propria configurazione e sostituire il markup syntheticnell'istruzione.

Se si desidera avere un markup diverso per codici di errore diversi, è possibile farlo anche abbastanza facilmente:

sub vcl_error {
    set obj.http.Content-Type = "text/html; charset=utf-8";
    if (obj.status == 404) {
        synthetic {"
            <!-- Markup for the 404 page goes here -->
        "};
    } else if (obj.status == 500) {
        synthetic {"
            <!-- Markup for the 500 page goes here -->
        "};
    } else {
        synthetic {"
            <!-- Markup for a generic error page goes here -->
        "};
    }
}

questo non funziona in VCL 4.0 - se usi vcl 4.0, vedi la risposta sotto
Philipp

18

Si noti che le risposte di cui sopra sono per Varnish 3. Poiché la domanda non specifica le informazioni sulla versione, sembra un momento appropriato per includere la risposta per la versione 4 anche perché è cambiata.

Spero che questo salverà le persone dalla lettura delle risposte di cui sopra e dall'inserimento di vcl_error nel loro VCL V4 :)

VCL incorporato per Varnish 4.0

sub vcl_synth {
    set resp.http.Content-Type = "text/html; charset=utf-8";
    set resp.http.Retry-After = "5";
    synthetic( {"<!DOCTYPE html>
<html>
  <head>
    <title>"} + resp.status + " " + resp.reason + {"</title>
  </head>
  <body>
    <h1>Error "} + resp.status + " " + resp.reason + {"</h1>
    <p>"} + resp.reason + {"</p>
    <h3>Guru Meditation:</h3>
    <p>XID: "} + req.xid + {"</p>
    <hr>
    <p>Varnish cache server</p>
  </body>
</html>
"} );
    return (deliver);
}

Nota anche che se vuoi lanciare un errore all'interno del tuo VCL, non usi più la funzione 'error', invece faresti:

return (synth(405));

Inoltre, gli errori 413, 417 e 503 del backend vengono automaticamente instradati attraverso questa funzione.


Si noti che questo non catturerà "errori di recupero back-end". Per catturarli, devi anche creare un sub vcl_backend_error, come puoi vedere in serverfault.com/a/665917/102757 e serverfault.com/a/716767/102757
lucaferrario
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.