Niestandardowa strona błędu 503 z lakierem

Odpowiedzi:

13

Lakier FAQ sugeruje użycie vcl_error za to (i to jak ja to zrobiłem):

To jest domyślny VCL strony błędu:

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

jeśli chcesz wersję niestandardową, po prostu zastąp funkcję w konfiguracji i zastąp znacznik w syntheticinstrukcji.

Jeśli chcesz mieć różne znaczniki dla różnych kodów błędów, możesz to zrobić dość łatwo:

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
źródło
nie działa to w VCL 4.0 - jeśli używasz vcl 4.0, zobacz odpowiedź poniżej
Filip
18

Zauważ, że powyższe odpowiedzi dotyczą Lakieru 3. Ponieważ pytanie nie określa informacji o wersji, wydaje się, że jest odpowiedni czas na dołączenie odpowiedzi dla Wersji 4 również po jej zmianie.

Mam nadzieję, że uratuje to ludzi przed przeczytaniem powyższych odpowiedzi i umieszczeniem vcl_error w V4 VCL :)

Wbudowany VCL dla lakieru 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);
}

Pamiętaj również, że jeśli chcesz zgłosić błąd z poziomu VCL, nie używasz już funkcji „błąd”, zamiast tego zrobiłbyś:

return (synth(405));

Również błędy 413, 417 i 503 z backendu są automatycznie trasowane przez tę funkcję.

Tom17
źródło
Pamiętaj, że to nie uchwyci „błędów pobierania zaplecza”. Aby je przechwycić, musisz również utworzyć sub vcl_backend_error, jak widać w serverfault.com/a/665917/102757 i serverfault.com/a/716767/102757
lucaferrario