在vcl_synth中,我正在尝试制作修改后的错误页面;我可能会将其转移到vcl_backend_error,但这是没有意义的,因为问题仍然存在。我使用的是CentOS 7,所以只能访问4.0,不能访问4.1。这一点很重要,因为std.file_exists只存在于>= 4.1中。使用来自不受信任的、未经测试的、破坏向前/向后兼容性的包是不可接受的。
为了处理503.html文件可能不存在的问题,我想测试合成输出,如果为null/空,则生成一个回退错误页面。为了进行调试,我将所有输出都放到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: 请停顿
发布于 2017-09-08 15:09:28
在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);
}
}发布于 2017-09-10 05:05:03
关于以下内容:
使用来自不受信任的、未经测试的、破坏向前/向后兼容性的包是不可接受的。
Varnish有一个dedicated repository for 4.1。
这些包是签名的,仅限4.1分支,不应破坏向前/向后兼容性。
另外,既然你在使用他们的软件,你基本上已经信任他们了。此外,最近的安全更新可能会使其更快地到达他们的存储库,而不是EPEL等。
而Varnish 4.0的官方版本是EOL。
https://stackoverflow.com/questions/46107748
复制相似问题