Cookies Varnish 4 vcl_deliver从后端_响应中删除设置cookie

Cookies Varnish 4 vcl_deliver从后端_响应中删除设置cookie,cookies,varnish,setcookie,varnish-vcl,Cookies,Varnish,Setcookie,Varnish Vcl,我知道vcl_deliver的这种行为,它从后端删除每个http.set-cookie 这是我的一块清漆原木: - VCL_call DELIVER - RespUnset Set-Cookie: JSESSIONID=20E1512F59F3BA8A7BAE6AC2C10B0F66; Path=/; HttpOnly - RespUnset Set-Cookie: OpenCmsOuFqn=/; Expires=Wed, 03-Feb-2016 13

我知道vcl_deliver的这种行为,它从后端删除每个http.set-cookie

这是我的一块清漆原木:

-   VCL_call       DELIVER
-   RespUnset      Set-Cookie: JSESSIONID=20E1512F59F3BA8A7BAE6AC2C10B0F66; Path=/; HttpOnly
-   RespUnset      Set-Cookie: OpenCmsOuFqn=/; Expires=Wed, 03-Feb-2016 13:18:41 GMT; Path=/
-   RespUnset      Set-Cookie: OpenCmsUserName=Admin; Expires=Wed, 03-Feb-2016 13:18:41 GMT; Path=/
-   RespHeader     Set-Cookie: LB=fep001; path=/;
-   RespHeader     X-Cache: MISS
-   VCL_return     deliver
我可能没有看到配置错误,我也发布了它。 这是我的默认.vcl配置文件:

vcl 4.0;

import std;
import directors;

backend fep001 {
    .host = "fe1";
    .port = "82";
    .probe = {
        .url = "/ping";
        .interval = 10s;
        .timeout = 1s;
        .window = 1;
        .threshold = 1;
        .expected_response = 200;
    }
}
backend fep002 {
    .host = "fe2";
    .port = "82";
    .probe = {
        .url = "/ping";
        .interval = 10s;
        .timeout = 1s;
        .window = 1;
        .threshold = 1;
        .expected_response = 200;
    }
}

sub vcl_init {
    new cluster = directors.round_robin();
    new clusterhash = directors.hash();
    cluster.add_backend(fep001);
    clusterhash.add_backend(fep001, 1.0);
    cluster.add_backend(fep002);
    clusterhash.add_backend(fep002, 1.0);
}

sub vcl_recv {
    if (req.http.Cookie ~ "LB=fep[0-9]+") {
        set req.backend_hint = clusterhash.backend(req.http.Cookie.LB);
    } else {
        set req.backend_hint = cluster.backend();
    }
    if (! std.healthy(req.backend_hint)) {
        std.log("not healthy");
        set req.backend_hint = cluster.backend();
    }

    if (req.http.Cookie) {
        set req.http.Cookie = regsuball(req.http.Cookie, "(^|; ) *LB=[^;]+;? *", "\1");
    }

    if (req.method != "GET" && req.method != "HEAD") {
        return(pass);
    }
    if (req.url ~ "^/export/.*$") {
        return(hash);
    }
    return(pass);
}

sub vcl_backend_response {
    set beresp.http.X-node = beresp.backend.name;
    set beresp.http.Vary = "Accept-Encoding";
    if (bereq.url ~ "^/export/.*$" && beresp.status < 400) {
        set beresp.ttl = 30m;
    } else {
        set beresp.ttl = 0s;
    }
    return(deliver);
}

sub vcl_deliver {
    if (obj.hits == 0 && req.http.Cookie !~ "LB=fep[0-9]+") {
        set resp.http.Set-Cookie = "LB=" + resp.http.X-node + "; path=/;";
    }

    if (obj.hits > 0) {
        set resp.http.X-Cache = "HIT:" + obj.hits;
    } else {
        set resp.http.X-Cache = "MISS";
    }
}
vcl4.0;
进口性病;
进口主任;
后端fep001{
.host=“fe1”;
.port=“82”;
.probe={
.url=“/ping”;
.间隔时间=10秒;
.超时=1s;
.window=1;
.阈值=1;
.预期的_响应=200;
}
}
后端fep002{
.host=“fe2”;
.port=“82”;
.probe={
.url=“/ping”;
.间隔时间=10秒;
.超时=1s;
.window=1;
.阈值=1;
.预期的_响应=200;
}
}
子vcl_init{
新集群=控制器。循环循环();
new clusterhash=directors.hash();
集群。添加_后端(fep001);
clusterhash.add_后端(fep001,1.0);
集群。添加_后端(fep002);
clusterhash.add_后端(fep002,1.0);
}
子vcl_recv{
if(req.http.Cookie~“LB=fep[0-9]+”){
set req.backend\u hint=clusterhash.backend(req.http.Cookie.LB);
}否则{
set req.backend_hint=cluster.backend();
}
如果(!标准健康(要求后端提示)){
标准日志(“不健康”);
set req.backend_hint=cluster.backend();
}
if(req.http.Cookie){
设置req.http.Cookie=regsuball(req.http.Cookie,“(^;)*LB=[^;]+;?*”,“\1”);
}
如果(请求方法!=“GET”&&req方法!=“HEAD”){
返回(通行证);
}
如果(req.url~“^/export/*$”){
返回(散列);
}
返回(通行证);
}
子vcl_后端_响应{
设置beresp.http.X-node=beresp.backend.name;
设置beresp.http.Vary=“接受编码”;
if(bereq.url~“^/export/*$”&&beresp.status<400){
设置beresp.ttl=30m;
}否则{
设置beresp.ttl=0s;
}
归还(交付);
}
副vcl_交付{
如果(obj.hits==0&&req.http.Cookie!~“LB=fep[0-9]+”){
set resp.http.set-Cookie=“LB=“+resp.http.X-node+”;路径=/;”;
}
如果(对象命中率>0){
set resp.http.X-Cache=“HIT:”+obj.hits;
}否则{
设置resp.http.X-Cache=“MISS”;
}
}
我如何保存这些http头

多谢各位


大卫

我终于从这篇文章中找到了一个解决方案

Varnish 4似乎没有添加其他设置Cookie,而是覆盖它,并且没有以以下方式添加此类Varnish 3:

set resp.http.Set-Cookie = "LB=" + req.http.X-node + "; path=/;" + resp.http.Cookie;
这意味着您必须使用一些VMOD

我添加了cookie和头导入:

vcl 4.0;

import std;
import directors;
import cookie;
import header;
我对后端选择做了一些更改:

cookie.parse(req.http.cookie);
if (cookie.get("LB")) {
    set req.backend_hint = clusterhash.backend(cookie.get("LB"));
} else {
    set req.backend_hint = cluster.backend();
}
if (! std.healthy(req.backend_hint)) {
    std.log("not healthy");
    set req.backend_hint = cluster.backend();
}
最后,这是添加这些VMOD的主要原因:

if (obj.hits == 0 && req.http.Cookie !~ "LB=fep[0-9]+") {
    header.remove(resp.http.Set-Cookie,"^LB=.*$");
    header.append(resp.http.Set-Cookie,"LB=" + resp.http.X-node + "; Expires=" + cookie.format_rfc1123(now, 60m) + "; path=/;");
}
我希望这个答案能帮助别人