【问题标题】:Varnish removes PHPSESSID when unsetting cookieVarnish 在取消设置 cookie 时移除 PHPSESSID
【发布时间】:2013-08-19 08:21:11
【问题描述】:

长期以来,我一直在尝试在我的一些网站前面放置一个工作清漆 (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 画廊)之类的链接调用的

你有什么想法吗?提前致谢!

【问题讨论】:

    标签: cookies varnish varnish-vcl


    【解决方案1】:

    您必须在图像到达客户端的过程中过滤掉 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. 清漆将请求传递到后端而不使用 cookie。
    3. 后端完全填充请求并提供 Set-Cookie 标头(因为它没有任何 cookie)具有新值
    4. Varnish 无法缓存该对象,因为它有一个 Set-Cookie 标头(您的 pastebin 上的第 102 行)。
    5. Varnish 将图像与新 cookie 一起传递到您的浏览器。
    6. 您的浏览器会覆盖符合收到的 Set-Cookie 标头的 PHPSESSID cookie。

    【讨论】:

    • 它就像一个魅力!感谢您的解释,我了解我的 PHPSESSID(Tx 和 Rx)之间的区别。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2012-04-10
    • 2013-12-29
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    相关资源
    最近更新 更多