"合成"在清漆 4 中设置了哪个变量?



在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是正式的。

最新更新