Benutzerdefinierte 503-Fehlerseite mit Lack

Antworten:

13

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 syntheticAnweisung.

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 -->
        "};
    }
}
Conor McDermottroe
quelle
Das funktioniert nicht in VCL 4.0 - wenn Sie vcl 4.0 verwenden dann Antwort unten sehen
Philipp
18

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.

Tom17
quelle
Bitte beachten Sie, dass dies keine "Backend-Abruffehler" erfasst. Um sie zu erfassen, müssen Sie auch eine erstellen sub vcl_backend_error, wie Sie in serverfault.com/a/665917/102757 und serverfault.com/a/716767/102757
lucaferrario am