在Varnish中未设置 - 语法错误

时间:2010-05-19 21:49:10

标签: apache header varnish

我正在尝试隐藏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;
--------#####-----------------

有什么想法吗?

4 个答案:

答案 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,我在那里取消了标题。