我怎样才能告诉 Varnish 显示自定义的 HTML 错误页面,而不是默认的“Guru Meditation”消息?
答案1
这Varnish 常见问题解答建议对此使用 vcl_error(这就是我所做的):
这是错误页面的默认 VCL:
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);
}
如果您想要自定义版本,只需覆盖配置中的函数并替换语句中的标记synthetic
。
如果您想要对不同的错误代码使用不同的标记,您也可以相当轻松地做到这一点:
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 -->
"};
}
}
答案2
请注意,以上答案针对的是 Varnish 3。由于问题没有指定版本信息,因此似乎是时候将版本 4 的答案也包含在内,因为它已经发生了变化。
希望这可以让人们避免阅读上述答案并将 vcl_error 放入他们的 V4 VCL 中:)
Varnish 4.0 内置 VCL
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);
}
还要注意,如果您想从 VCL 内部抛出错误,您不再使用“错误”函数,而是执行以下操作:
return (synth(405));
此外,后端的 413、417 和 503 错误也会自动通过此功能路由。