在vcl_synth中,我正在尝试制作修改后的错误页面;我可能会将其移至vcl_backend_error,但这是有争议的,因为问题保持不变。我使用的是CentOS 7,因此只能访问4.0,而不是4.1。这很重要,因为std.file_exists仅在> = 4.1中存在。使用未经信任的,未经测试的来源的包装,这些包装破裂/向后兼容是不可接受的。
要处理503.html文件可能不存在的问题,我想测试合成输出,以及null/emptle生成后返回错误页面。为了调试,我将所有输出都投入Syslog;这不会以当前形式持续到生产。
样本:
sub vcl_synth {
if (resp.status == 503) {
set resp.http.Content-Type = "text/html; charset=utf-8";
synthetic(std.fileread("/var/www/vhost/" + req.http.host + "/error/503.html"));
std.syslog(3, "resp.http.body: " + resp.http.body);
return (deliver);
}
}
在上面的情况下,我清楚地看到resp.http.body是空的,但是返回页面并在我的浏览器中渲染。因此,如果这样做,合成集可以进行哪个变量?而且,可以测试吗?
# journalctl -f
...
Sep 08 02:17:17 REDACTED_HOSTNAME varnishd[32498]: resp.http.body:
pls halp
在vcl_synth
期间执行synthetic(...)
的执行不填充resp.http.body
。那只是一个随机的标题名称。一种可能的方法是用响应主体填充"临时变量":
sub vcl_synth {
if (resp.status == 503) {
set resp.http.Content-Type = "text/html; charset=utf-8";
set req.http.X-Synth-Body = std.fileread("/var/www/vhost/" + req.http.host + "/error/503.html");
synthetic(req.http.X-Synth-Body);
std.syslog(3, "req.http.X-Synth-Body: " + req.http.X-Synth-Body);
return (deliver);
}
}
关于:
使用未经信任,未经测试的来源的包裹是不可接受的
向前/向后兼容。
Varnish具有4.1的专用存储库。
这些软件包是签名的,仅特定于4.1分支,不应向前/向后兼容。
加,由于您使用的是他们的软件,因此本质上已经信任他们。此外,最近有一些安全更新可能使其更快地到其存储库,而不是Epel等。
和varnish 4.0是正式的。