Varnish:如何使用`std.ip()`来设置标题值

时间:2016-04-17 01:02:21

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

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


Error:(26, 0) Gradle DSL method not found: 'compile()'
Possible causes:
  • The project 'My Application' may be using a version of Gradle that does not contain the method. Open Gradle wrapper file
  • The build file may be missing a Gradle plugin. Apply Gradle plugin
  • 以上死于丑陋的死亡:

    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
    

    并且返回第一个IP地址后,表现不如我想要的那样。

    更新

    或者我发现以下内容确实可以用于相同的目的,但仍无法使用 ... *** 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 ...

    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{...}文件中,其中定义了我的所有后端,探针。但是,当我尝试通过包含到varnishtest文件中来测试该代码时,如下所示:

    default.vcl

    测试未获取服务器varnish v1 -vcl+backend { include "/path/to/file.vcl"; } -start 中的expect语句。如果有人能够对以下内容给出一些明确的说明,我会非常感激:

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

    1 个答案:

    答案 0 :(得分:0)

    您需要添加

    导入标准;

    位于vcl文件的顶部