【问题标题】:Varnish 4, cache page with cookiesVarnish 4、用cookies缓存页面
【发布时间】:2015-02-07 16:56:23
【问题描述】:

我想缓存每个页面(即使有 cookie),php 中的后端没有为此做好准备,所以它发送了多个 Set-Cookie 标头。当我删除所有 session_start 和 setcookie 功能时,页面 HITs,但是当我将我的 vcl 设置为 varnish 自动为我执行此操作时,页面总是未命中。

这是我的 default.vcl

vcl 4.0;

backend default {
    .host = "myhost.app";
    .port = "80";
}

sub vcl_recv {
    unset req.http.cookie;
}

sub vcl_backend_response {
    unset beresp.http.set-cookie;
}

sub vcl_deliver {
    if (obj.hits > 0) {
       set resp.http.X-Cache = "HIT";
    } else {
       set resp.http.X-Cache = "MISS";
    }
}

【问题讨论】:

  • php 文件返回的 Cache-Control 和 TTL 响应头值是多少?
  • 嗨@MarcelDumont,我认为这无关紧要,我不想改变我的后端。是否可以通过varnish VCL取消设置CacheControl和TTL,所以varnish会缓存所有页面?
  • 询问的原因是,除了 cookie 之外,还有更多因素会导致 varnish 意外通过。而 CacheControl 和 TTL 往往是原因。所以它是相关的。如果您可以显示完整的请求和响应标头,那将是理想的。

标签: php cookies varnish varnish-vcl


【解决方案1】:

正如 Jorge Nerín 所说,我每次都面临缓存 MISS 并更新 sub vcl_backend_response{..}。现在它显示缓存命中,但登录没有发生。这很明显是因为unset beresp.http.set-cookie;。所以我从Manipulating request headers in VCL 得到了基于 URL 取消设置 cookie 的想法。我在vcl_backend_response 中应用了相同的内容。在我的应用程序登录 URL 中包含 auth。所以我在每个地方都更新为unset beresp.http.set-cookie;,除非URL包含auth。现在正在登录并缓存 HIT。希望这对社区有所帮助

sub vcl_backend_response {
 set beresp.ttl = 120 s;
 if ((bereq.url ~ "auth")){
  }
 else{
    unset beresp.http.set-cookie;
 }
 #rest of code
}

【讨论】:

    【解决方案2】:

    看来你要进入泥泞的水域,但尝试强制一个ttl:

    sub vcl_backend_response {
       set beresp.ttl = 120 s;
       unset beresp.http.set-cookie;
    }
    

    通过缓存忽略 cookie 和 ttls 来检查您是否没有破坏。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-24
      • 1970-01-01
      相关资源
      最近更新 更多