当未设置 cookie“lang”时,如何让调用通过 Varnish?

当未设置 cookie“lang”时,如何让调用通过 Varnish?

当未设置 cookie“lang”时,如何在 varnish 中让调用通过?当设置 cookie“lang”时,我想让调用通过而不返回缓存,并将请求发送到 apache,我该怎么做?

答案1

当未设置 lang cookie 时绕过缓存

最基本的形式是,这是您需要的 VCL 代码经过对不包含 cookie 的后端请求lang

sub vcl_recv {
    if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)") {
        return(pass);
    }
}

然而,您可能需要定义一些逻辑以防lang设置了 cookie。

使用 lang cookie 的值

以下 VCL 代码片段提取由 cookie 设置的语言lang并将其存储在 中req.http.lang

此值用于为每种语言创建缓存变体:

sub vcl_recv {
    if(req.http.Cookie !~ "(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)") {
        return(pass);
    } 
    set req.http.lang = regsub(req.http.Cookie,"(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)","\3");
    //Some other logic
    return(hash);
}

sub vcl_hash {
    if(req.http.lang) {
        hash_data(req.http.lang);
    }
}

上面的代码片段也明确调用了return(hash)。有时,您需要在lang设置 cookie 时强制 Varnish 进行缓存,因为当存在 cookie 时,标准 Varnish 行为会缓存任何内容。

我添加了一条//Some other logic注释,因为我假设会有更多逻辑来绕过缓存。例如,当使用除 和 之外的请求方法时GETHEAD或者对于需要绕过缓存的自定义 URL 模式。

避免过多的缓存变体

hash_data(req.http.lang)语句将确保为 cookie 可能具有的每个值创建一个缓存变体lang

这样做的危险在于,心怀不轨的用户会开始向langcookie 中添加随机值来填充缓存。

考虑到这种风险,在正则表达式中明确列出支持的语言是有意义的。

这是初始正则表达式:

(^|([^;]*;)+)\s*lang=([^;]*)\s*($|(;[^;]*)+)

以下是硬编码支持语言的示例:

(^|([^;]*;)+)\s*lang=(en|es|de|it|es|fr|nl)\s*($|(;[^;]*)+)

只需根据您的需要和 Web 平台支持的语言来定制此正则表达式即可。

相关内容