Comment puis-je dire à Varnish d'afficher une page d'erreur HTML personnalisée au lieu du message par défaut "Guru Meditation" ?
Comment puis-je dire à Varnish d'afficher une page d'erreur HTML personnalisée au lieu du message par défaut "Guru Meditation" ?
Réponses:
La FAQ Varnish suggère d'utiliser vcl_error pour cela (et c'est comme ça que je l'ai fait):
Il s'agit de la VCL par défaut pour la page d'erreur:
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);
}
si vous voulez une version personnalisée, remplacez simplement la fonction dans votre configuration et remplacez le balisage dans l' synthetic
instruction.
Si vous souhaitez avoir un balisage différent pour différents codes d'erreur, vous pouvez le faire assez facilement aussi:
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 -->
"};
}
}
Notez que les réponses ci-dessus sont pour le vernis 3. Comme la question ne spécifie pas les informations de version, il semble que le moment soit approprié pour inclure la réponse pour la version 4 également car elle a changé.
J'espère que cela évitera aux gens de lire les réponses ci-dessus et de mettre vcl_error dans leur VCL V4 :)
VCL intégré pour 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);
}
Notez également que si vous souhaitez générer une erreur à partir de votre VCL, vous n'utilisez plus la fonction «erreur», mais plutôt:
return (synth(405));
De plus, les erreurs 413, 417 et 503 du backend sont automatiquement acheminées via cette fonction.
sub vcl_backend_error
, comme vous pouvez le voir dans serverfault.com/a/665917/102757 et serverfault.com/a/716767/102757