【问题标题】:Varnish: How to use `std.ip()` to set a header valueVarnish:如何使用 `std.ip()` 设置标头值
【发布时间】:2016-08-08 20:49:29
【问题描述】:

我正在尝试使用 std.ip 这是 varnish 4.0 的一部分来返回客户端 IP,它应该是 X-Forwarded-For 标头中的第一个有效 IP 地址,如果文档中的示例是正确的。

varnishtest "Test v4 vcl X-Forwarded-For Header logic"

server s1 {
   rxreq
   expect req.http.X-Real-IP == "2.1.1.1"
   expect req.http.X-Forwarded-For == "2.1.1.1, 3.3.3.3, 3.3.3.3, 127.0.0.1"
   txresp
} -start

varnish v1 -vcl+backend {
   sub vcl_recv {
      set req.http.X-Real-IP = std.ip(req.http.X-Forwarded-For, "0.0.0.0");
   }
} -start

client c1 {
   txreq -url "/" -hdr "X-Forwarded-For: 2.1.1.1, 3.3.3.3, 3.3.3.3"
   rxresp
}

client c1 -run

上面死得很丑:

...
***  v1    0.9 debug| Assert error in vwk_thread(), waiter/cache_waiter_kqueue.c line 115:\n
***  v1    0.9 debug|   Condition(read(vwk->pipe[0], &c, 1) == 1) not true.\n
...

并且通过返回第一个 IP 地址并没有按照我的意愿行事。

更新

另外,我发现以下内容确实可以用于相同的目的,但仍然无法让 std.ip 工作:

varnish v1 -vcl+backend {
   sub vcl_recv {
      set req.http.X-Real-IP = regsub(req.http.X-Forwarded-For, "\s*,.*$", "");
   }
} -start

作为后续问题。这个vcl_recv{...} 逻辑实际上存在于我的default.vcl 文件中,其中定义了我所有的后端、探针。但是,当我尝试通过包含到 varnishtest 文件中来测试该代码时,如下所示:

varnish v1 -vcl+backend {
        include "/path/to/file.vcl";
} -start

测试没有得到服务器s1 中的expect 语句。如果有人能对以下内容做出澄清,我会非常高兴:

  1. 为什么std.ip(req.http.X-Forwarded-For, "0.0.0.0") 的行为不符合预期?
  2. 如何在集合服务器s1 中使用expect 语句测试包含的default.vcl

谢谢。

【问题讨论】:

    标签: http-headers varnish varnish-vcl varnish-4


    【解决方案1】:

    你需要添加一行

    导入标准;

    在 vcl 文件的顶部

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-29
      相关资源
      最近更新 更多