如何使Varnish不被忽略,而不是删除cookies

我想使用Varnish来caching某些页面,即使存在cookie。 有三种可能性,我需要照顾:

  1. 匿名用户正在查看某个页面
  2. login的用户正在用光定制查看某个页面。 这些自定义都存储在一个signed-cookie中,并由Javascriptdynamic填充。 不同的cookie http头没有设置。
  3. login的用户正在使用数据库中的自定义数据查看某个页面。 不同的cookie http头被设置。

预期的行为将是:

  1. caching页面。 这是Varnish处理的最基本的情况。
  2. caching页面,不要删除cookie,因为一些Javascript逻辑需要它。
  3. 永远不要caching这个页面,因为不同的cookie正在传递cookie的内容会影响这个页面的输出。

我已经阅读了一些关于Varnish的文档,我不知道这是默认行为,还是在VCL中需要做一些设置才能实现。

默认情况下,Varnish不会使用Cookie标头caching请求:

http://varnish-cache.org/svn/trunk/varnish-cache/bin/varnishd/default.vcl

sub vcl_recv { (...) if (req.http.Authorization || req.http.Cookie) { /* Not cacheable by default */ return (pass); } return (lookup); 

您需要将所需的行为编码到configuration中。 请注意,Cookie是客户端请求的一部分,而不是“页面”(实际上是对象)。 “页面”(对象)带有一个“Set-Cookie”头 – 这是将被caching的。

此外,“变化:Cookie”并不意味着“不要caching”。 这意味着caching一个对象的每个Cookie接收到的值。

如果您的应用程序没有生成基于Cookie的任何内容,忽略它可能是安全的:

 - if (req.http.Authorization || req.http.Cookie) { + if (req.http.Authorization) { 

做一些testing,你会得到它的挂钩。 希望这可以帮助。

如果我正确地理解了你,你不需要一个特定的cookie作为键的一部分 – 但你需要保持完好?

你需要将vcl_hash中的散列设置为req.url + req.http.host(也可能是其他),但不是特定的cookie。

我认为我的一个post可以帮助你在正确的方向: 忽略Varnish VCL中的GET参数