Come posso dire a Varnish di mostrare una pagina di errore html personalizzata invece del messaggio predefinito "Meditazione Guru" ?
Come posso dire a Varnish di mostrare una pagina di errore html personalizzata invece del messaggio predefinito "Meditazione Guru" ?
Risposte:
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 synthetic
nell'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 -->
"};
}
}
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.
sub vcl_backend_error
, come puoi vedere in serverfault.com/a/665917/102757 e serverfault.com/a/716767/102757