繁体   English   中英

基于 Cookie 的清漆响应

[英]Varnish response based on Cookie

我有以下清漆配置:


# Default backend definition. Set this to point to your content server.
backend default {
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_hash {

    if (req.http.cookie ~ "wordpress_logged_in_[a-z0-9]+") {
        set req.http.X-TMP = regsuball(req.http.cookie, "wordpress_logged_in_[a-z0-9]+=[^;]+(; )?", "; \1=");
        hash_data(req.http.X-TMP);
        unset req.http.X-TMP;
  }

}

sub vcl_recv {

    #Admin Area
    if (req.url ~ "wp-admin|wp-login") {
        return (pass);
    }


    #woocommerce specifics
    if (req.url ~ "^/(cart|my-account|checkout|addons)") {
        return (pass);
    }

    if ( req.url ~ "\?add-to-cart=" ) {
        return (pass);
    }


    set req.http.cookie = regsuball(req.http.cookie, "wp-settings-\d+=[^;]+(; )?", "");
    set req.http.cookie = regsuball(req.http.cookie, "wp-settings-time-\d+=[^;]+(; )?", "");
    set req.http.cookie = regsuball(req.http.cookie, "wordpress_test_cookie=[^;]+(; )?", "");
    #set req.http.cookie = regsuball(req.http.cookie, "wordpress_logged_in_[a-z0-9]+=[^;]+(; )?", "; \1=");

    #more woocommerce specifics

    # Unset Cookies except for WordPress admin and WooCommerce pages
    if (!(req.url ~ "(wp-login|wp-admin|cart|my-account/*|wc-api*|checkout|addons|logout|lost-password|product/*)")) {
        unset req.http.cookie;
    }

    # Pass through the WooCommerce dynamic pages
    if (req.url ~ "^/(cart|my-account/*|checkout|wc-api/*|addons|logout|lost-password|product/*)") {
        return (pass);
    }

    # Pass through the WooCommerce add to cart
    if (req.url ~ "\?add-to-cart=" ) {
        return (pass);
    }

    # Pass through the WooCommerce API
    if (req.url ~ "\?wc-api=" ) {
        return (pass);
    }

    if (req.http.cookie == "") {

        unset req.http.cookie;
    }

    return(hash);
}


sub vcl_backend_response {
    # Happens after we have read the response headers from the backend.
    #
    # Here you clean the response headers, removing silly Set-Cookie headers
    # and other mistakes your backend does.

    if (beresp.ttl == 120s) {

        set beresp.ttl = 1h;

    }

    #set beresp.http.host = bereq.http.host;
}

sub vcl_deliver {
    # Happens when we have all the pieces we need, and are about to send the
    # response to the client.
    #
    # You can do accounting or modifying the final object here.
}

我的目标是确保根据用户是否登录,在 URL 上有两个不同的缓存版本。我可以通过名为wordpress_logged_in_[some id]的 cookie 来确定。

我试图在本文为此寻找灵感,但我无法根据客户端是否具有前面提到的 cookie 来获得两种不同的结果。 对我来说,无论 cookie 是否存在,它似乎都呈现相同的缓存内容。

我很感激在理解我的问题方面的一些帮助。

看起来您正在做所有正确的事情,但我建议您进行一些调试。

如果运行以下命令, Hash标签将出现在varnishlog

varnishadm param.set vsl_mask +hash

然后,您可以根据 cookie 运行以下命令来检查哈希值是否不同

varnishlog -g request -i requrl -i hash -I reqHeader:Cookie

此日志记录命令列出以下项目:

  • 请求网址
  • 饼干头
  • 创建的哈希

这应该可以帮助您弄清楚发生了什么。

应用本文中建议的解决方案将产生与登录用户(每用户缓存)一样多的缓存条目。

如果您想要一个缓存对象用于来宾,另一个用于所有登录用户,则对基于 cookie 的存在设置的“布尔值”进行散列:

sub vcl_hash {
  if (req.http.cookie ~ "wordpress_logged_in_") {
    hash_data("wordpress_logged_in");
  }
  # the builtin.vcl will take care of also varying cache on Host/IP and URL 
}

只有在存在 cookie 的情况下,生成的页面不包含特定于用户的内容时,这才是安全的。 例如,如果“登录页面”与“注销页面”的区别仅在于站点标题部分中是否存在“注销”文本。

在内容绝对特定于用户的任何地方,您都不想应用此类逻辑。 例如,标题文本中的“嗨,约翰”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM