很长一段时间以来,我一直在尝试在我的一些网站前涂上一层工作清漆(3.0.4)。我从一个干净的配置文件(带有varnish的文件,"/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向我显示了不同的日志PHPSSID:
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画廊)的链接调用的
你有主意吗?提前感谢!
您必须在图像到达客户端的途中过滤回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;
}
// ...
}
现在这就是正在发生的事情(图像缓存有一个空的浏览器缓存):
- 请求传给瓦尼什,瓦尼什取出饼干
- Varnish在没有cookie的情况下将请求传递到后端
- 后端完全填充请求,并提供一个带有新值的Set-Cookie headder(当它没有任何Cookie时)
- Varnish无法缓存对象,因为它有一个Set Cookie头标(你的pastebin上的第102行)
- Varnish将图像和新cookie一起传递到浏览器
- 您的浏览器会覆盖您的PHPSESSID cookie,该cookie符合收到的Set cookie标头