2

我试图从 Varnish 隐藏 Apache 在每个请求上返回的“服务器”标头。

在子 vcl_fetch 中使用:

unset obj.http.Server;

在清漆开始我得到:

Expected action, 'if' or '}'
(/etc/varnish/default.vcl Line 43 Pos 9)
    unset obj.http.Server;
--------#####-----------------

有任何想法吗?

4

4 回答 4

2

在最近的版本(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 版本无法做到这一点。

于 2010-05-20T00:01:28.490 回答
1

我正在使用 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;
    }
}
于 2010-05-20T14:16:09.997 回答
1

我开始安装 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'..”。

我还尝试设置自定义标题并将其删除。那也没有用。

于 2010-05-27T20:13:55.213 回答
1

最终修复了它。

我在 vcl_recv 中有一个返回(管道),它使清漆永远不会进入我正在取消设置标题的 vcl_fetch 。

于 2010-05-31T21:46:45.453 回答