我正在尝试隐藏Apache在Varnish的每个请求中返回的“Server”标头。
在sub vcl_fetch中使用:
unset obj.http.Server;
在Varnish开始我得到:
Expected action, 'if' or '}'
(/etc/varnish/default.vcl Line 43 Pos 9)
unset obj.http.Server;
--------#####-----------------
有什么想法吗?
答案 0 :(得分:2)
在最近的版本(2.1系列)中,响应对象称为beresp,vcl_fetch 中的类似内容有效(我刚在Varnish 2.1.0上测试过):
unset beresp.http.Server;
我安装了你正在使用的版本(1.1.2)并且你提到了完全相同的行为;看来unset关键字不起作用,至少不在vcl_fetch函数中。这很奇怪,至少有一个例子我发现使用unset来表示exact purpose。
如果可能,我建议升级到最新的Varnish,因为我认为如果您观察到的未设置行为是一个错误,团队将不愿意修复它。
除此之外,您可能想尝试将Server设置为其他内容:
set obj.http.Server = "";
set obj.http.Server = "BogoServer Whatever";
假设您的目标是隐藏服务器签名。如果你想要的是完全消除标题,我冒昧地说你的版本的Varnish无法做到。
答案 1 :(得分:1)
我正在使用Varnish 1.1.2 也用beresp测试并发生同样的错误。
这就像是未设置的错误。 这是完整的获取:
sub vcl_fetch {
unset obj.http.Server;
# force minimum ttl of 6 hours
if (obj.ttl < 6h) {
set obj.ttl = 6h;
}
}
答案 2 :(得分:1)
我开始安装Varnish 2.1.2,这是迄今为止的最新版本。 我不再获得任何语法错误,但未应用所需的效果。这个弹性标题仍在那里。
sub vcl_fetch {
unset beresp.http.Server;
set beresp.http.Server = "Apache";
}
我使用Firebug来查看标题,这就是我所看到的:
Server Apache/2.2.9 (Debian)
我尝试了一些变化,比如只是取消设置而不是设置,没有任何效果。
这可能是逻辑问题吗?也许未设置需要放在不同的 sub 中。我尝试将它放在vcl_miss和vcl_deliver中。得到“变量'beresp.http.Server'无法在方法中访问..”两次。
我也尝试过设置自定义标头并将其删除。这也不起作用。
答案 3 :(得分:1)
最终解决了这个问题。
我在vcl_recv中有一个返回(管道),使得varnish永远不会进入vcl_fetch,我在那里取消了标题。