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 -->
        "};
    }
}

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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.