0

很长一段时间以来,我一直在尝试在我的一些网站前面放置一个工作清漆(3.0.4)。我从一个干净的配置文件开始(与清漆一起提供的配置文件,“/usr/share/doc/varnish/examples/default.vcl.gz”)。

好吧,它正在工作,但它似乎没有缓存任何东西(我添加了标题来查看它:https ://www.varnish-cache.org/trac/wiki/VCLExampleHitMissHeader )。

所以我将这些行添加到我的 sub_recv :

if (req.url ~ "\.(png|gif|jpg|jpeg|js|css|ico|pdf)$") {     
unset req.http.Cookie;      
    }

一旦我输入这些行,我的会话在加载一些图片后就停止了,并且 varnishlog 向我显示不同 PHPSESSID 的日志:

16 RxHeader     c Cookie: PHPSESSID=gkl02227ef1iq4joai0tsbi026
23 TxHeader     b Cookie: PHPSESSID=oomupd8tnvirpn8eamsertuih4
...

完整的 default.vcl 已在此处发布:http: //pastebin.com/gmdym1sr

编辑:也许它有一些重要性,但图像被称为“http://domain.com/?t=Thb&f=picture.jpg”(PhotoShow画廊)之类的链接

你有想法吗?提前致谢!

4

1 回答 1

2

您必须在图像到达客户端的方式上过滤掉 cookie:

sub vcl_fetch {
  // ... Line .82 in your pastebin
  if (req.url ~ "\.(png|gif|jpg|jpeg|js|css|ico|pdf)$") {     
    unset beresp.http.set-cookie;      
  }
  // ...
}

现在这是正在发生的事情(图像缓存为空的浏览器缓存):

  1. 请求来到 Varnish,Varnish 删除了 cookie。
  2. Varnish 将请求传递到后端而不使用 cookie。
  3. 后端完全填充请求并提供具有新值的 Set-Cookie 标头(因为它没有任何 cookie)。
  4. Varnish 无法缓存该对象,因为它有一个 Set-Cookie 标头(您的 pastebin 上的第 102 行)。
  5. Varnish 将图像与新的 cookie 一起传递到您的浏览器。
  6. 您的浏览器会覆盖符合收到的 Set-Cookie 标头的 PHPSESSID cookie。
于 2013-08-17T14:07:48.237 回答