Wie kann ich Varnish anweisen, anstelle der Standardmeldung "Guru Meditation" eine benutzerdefinierte HTML-Fehlerseite anzuzeigen ?
Wie kann ich Varnish anweisen, anstelle der Standardmeldung "Guru Meditation" eine benutzerdefinierte HTML-Fehlerseite anzuzeigen ?
Antworten:
In den Lack-FAQ wird vorgeschlagen , hierfür vcl_error zu verwenden (und so habe ich es gemacht):
Dies ist die Standard-VCL für die Fehlerseite:
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);
}
Wenn Sie eine benutzerdefinierte Version wünschen, überschreiben Sie einfach die Funktion in Ihrer Konfiguration und ersetzen Sie das Markup in der synthetic
Anweisung.
Wenn Sie unterschiedliche Markierungen für unterschiedliche Fehlercodes haben möchten, können Sie dies auch ziemlich einfach tun:
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 -->
"};
}
}
Beachten Sie, dass die obigen Antworten für Varnish 3 gelten. Da in der Frage keine Versionsinformationen angegeben sind, ist es an der Zeit, die Antwort für Version 4 ebenfalls aufzunehmen, da sie sich geändert hat.
Hoffentlich erspart dies den Leuten das Lesen der obigen Antworten und das Einfügen von vcl_error in ihre V4-VCL :)
Eingebaute VCL für 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);
}
Beachten Sie auch, dass Sie, wenn Sie einen Fehler aus Ihrer VCL werfen möchten, nicht mehr die 'error'-Funktion verwenden, sondern Folgendes tun würden:
return (synth(405));
Außerdem werden 413-, 417- und 503-Fehler vom Backend automatisch durch diese Funktion geleitet.
sub vcl_backend_error
, wie Sie in serverfault.com/a/665917/102757 und serverfault.com/a/716767/102757