¿Cómo puedo decirle a Varnish que muestre una página de error html personalizada en lugar del mensaje predeterminado "Meditación Gurú" ?
¿Cómo puedo decirle a Varnish que muestre una página de error html personalizada en lugar del mensaje predeterminado "Meditación Gurú" ?
Respuestas:
Las preguntas frecuentes de Varnish sugieren usar vcl_error para esto (y así es como lo hice):
Este es el VCL predeterminado para la página de error:
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 desea una versión personalizada, simplemente anule la función en su configuración y reemplace el marcado en la synthetic
declaración.
Si desea tener un marcado diferente para diferentes códigos de error, también puede hacerlo con bastante facilidad:
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 -->
"};
}
}
Tenga en cuenta que las respuestas anteriores son para Varnish 3. Como la pregunta no especifica la información de la versión, parece un momento apropiado para incluir la respuesta para la Versión 4 también porque ha cambiado.
Con suerte, esto evitará que las personas lean las respuestas anteriores y pongan vcl_error en su V4 VCL :)
VCL incorporado para barniz 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);
}
Tenga en cuenta también que si desea lanzar un error desde su VCL, ya no usa la función 'error', en su lugar haría:
return (synth(405));
Además, los errores 413, 417 y 503 del backend se enrutan automáticamente a través de esta función.
sub vcl_backend_error
, como puede ver en serverfault.com/a/665917/102757 y serverfault.com/a/716767/102757