Làm cách nào tôi có thể yêu cầu Varnish hiển thị trang lỗi html tùy chỉnh thay vì thông báo "Thiền sư" mặc định ?
Làm cách nào tôi có thể yêu cầu Varnish hiển thị trang lỗi html tùy chỉnh thay vì thông báo "Thiền sư" mặc định ?
Câu trả lời:
Câu hỏi thường gặp về Varnish gợi ý sử dụng vcl_error cho việc này (và đó là cách tôi đã thực hiện):
Đây là VCL mặc định cho trang lỗi:
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);
}
nếu bạn muốn có một phiên bản tùy chỉnh, chỉ cần ghi đè chức năng trong cấu hình của bạn và thay thế đánh dấu trong synthetic
câu lệnh.
Nếu bạn muốn có đánh dấu khác nhau cho các mã lỗi khác nhau, bạn cũng có thể thực hiện điều đó khá dễ dàng:
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 -->
"};
}
}
Lưu ý rằng các câu trả lời trên là dành cho Varnish 3. Vì câu hỏi không chỉ định thông tin phiên bản, có vẻ như đây là thời điểm thích hợp để đưa câu trả lời cho Phiên bản 4 vì nó đã thay đổi.
Hy vọng rằng điều này sẽ cứu mọi người khỏi việc đọc các câu trả lời ở trên và đưa vcl_error vào V4 VCL của họ :)
Được xây dựng VCL cho 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);
}
Cũng lưu ý rằng nếu bạn muốn đưa ra một lỗi từ bên trong VCL của mình, bạn không còn sử dụng chức năng 'lỗi' nữa, thay vào đó bạn sẽ làm:
return (synth(405));
Ngoài ra, 413, 417 và 503 lỗi từ phụ trợ được tự động định tuyến thông qua chức năng này.
sub vcl_backend_error
, như bạn có thể thấy trong serverfault.com/a/665917/102757 và serverfault.com/a/716767/102757