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