【问题标题】:unset in Varnish - syntax error在 Varnish 中未设置 - 语法错误
【发布时间】:2010-06-01 05:46:45
【问题描述】:
我试图从 Varnish 中隐藏 Apache 在每个请求中返回的“Server”标头。
在子 vcl_fetch 中使用:
unset obj.http.Server;
在清漆开始时,我得到:
Expected action, 'if' or '}'
(/etc/varnish/default.vcl Line 43 Pos 9)
unset obj.http.Server;
--------#####-----------------
有什么想法吗?
【问题讨论】:
标签:
apache
header
varnish
【解决方案1】:
在最近的版本(2.1 系列)中,响应对象被称为 beresp,而在 vcl_fetch 中类似的东西确实工作(我刚刚在 Varnish 2.1.0 上测试过):
unset beresp.http.Server;
我安装了您正在使用的版本 (1.1.2) 并得到了您提到的完全相同的行为;看起来 unset 关键字不起作用,至少在 vcl_fetch 函数中不起作用。这很奇怪,因为我发现至少有一个例子提到了对 exact purpose 使用 unset。
如果可能,我建议升级到最新的 Varnish,因为我认为如果您观察到的未设置行为是错误,那么团队不太可能愿意修复它。
除此之外,您可能想尝试将 Server 设置为其他内容:
set obj.http.Server = "";
set obj.http.Server = "BogoServer Whatever";
假设您的目标是隐藏服务器签名。如果您想要完全消除标题,我敢说您的 Varnish 版本无法做到这一点。
【解决方案2】:
最终修复了它。
我在 vcl_recv 中有一个返回(管道),这使得清漆永远不会进入我取消设置标题的 vcl_fetch。
【解决方案3】:
我正在使用 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;
}
}
【解决方案4】:
我开始安装 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'..”。
我还尝试设置自定义标题并将其删除。那也没用。