Page d'erreur 503 personnalisée avec vernis

Réponses:

13

La FAQ Varnish suggère d'utiliser vcl_error pour cela (et c'est comme ça que je l'ai fait):

Il s'agit de la VCL par défaut pour la page d'erreur:

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 vous voulez une version personnalisée, remplacez simplement la fonction dans votre configuration et remplacez le balisage dans l' syntheticinstruction.

Si vous souhaitez avoir un balisage différent pour différents codes d'erreur, vous pouvez le faire assez facilement aussi:

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
la source
cela ne fonctionne pas dans VCL 4.0 - si vous utilisez vcl 4.0, voir la réponse ci
Philipp
18

Notez que les réponses ci-dessus sont pour le vernis 3. Comme la question ne spécifie pas les informations de version, il semble que le moment soit approprié pour inclure la réponse pour la version 4 également car elle a changé.

J'espère que cela évitera aux gens de lire les réponses ci-dessus et de mettre vcl_error dans leur VCL V4 :)

VCL intégré pour 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);
}

Notez également que si vous souhaitez générer une erreur à partir de votre VCL, vous n'utilisez plus la fonction «erreur», mais plutôt:

return (synth(405));

De plus, les erreurs 413, 417 et 503 du backend sont automatiquement acheminées via cette fonction.

Tom17
la source
Veuillez noter que cela ne capturera pas les "erreurs d'extraction de backend". Pour les capturer, vous devez également créer un sub vcl_backend_error, comme vous pouvez le voir dans serverfault.com/a/665917/102757 et serverfault.com/a/716767/102757
lucaferrario