首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Varnish 4中'synthetic‘设置了哪个变量?

在Varnish 4中'synthetic‘设置了哪个变量?
EN

Stack Overflow用户
提问于 2017-09-08 10:30:54
回答 2查看 422关注 0票数 0

在vcl_synth中,我正在尝试制作修改后的错误页面;我可能会将其转移到vcl_backend_error,但这是没有意义的,因为问题仍然存在。我使用的是CentOS 7,所以只能访问4.0,不能访问4.1。这一点很重要,因为std.file_exists只存在于>= 4.1中。使用来自不受信任的、未经测试的、破坏向前/向后兼容性的包是不可接受的。

为了处理503.html文件可能不存在的问题,我想测试合成输出,如果为null/空,则生成一个回退错误页面。为了进行调试,我将所有输出都放到syslog中;这不会以当前的形式持续到生产环境中。

示例:

代码语言:javascript
复制
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是空的,但是页面被返回并在我的浏览器中呈现。那么,如果是这样的话,合成设置了哪个变量呢?而且,它可以被测试吗?

代码语言:javascript
复制
# journalctl -f
...
Sep 08 02:17:17 REDACTED_HOSTNAME varnishd[32498]: resp.http.body: 

请停顿

EN

回答 2

Stack Overflow用户

发布于 2017-09-08 15:09:28

vcl_synth期间执行synthetic(...)不会填充resp.http.body。这只是一个随机的头名称。一种可能的方法是用响应体填充“临时变量”:

代码语言:javascript
复制
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);
    }
}
票数 1
EN

Stack Overflow用户

发布于 2017-09-10 05:05:03

关于以下内容:

使用来自不受信任的、未经测试的、破坏向前/向后兼容性的包是不可接受的。

Varnish有一个dedicated repository for 4.1

这些包是签名的,仅限4.1分支,不应破坏向前/向后兼容性。

另外,既然你在使用他们的软件,你基本上已经信任他们了。此外,最近的安全更新可能会使其更快地到达他们的存储库,而不是EPEL等。

而Varnish 4.0的官方版本是EOL。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46107748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档