haifanghui/session-monster

一个吞噬会话cookie的怪物 - 与Varnish + Laravel兼容

dev-master 2014-09-28 11:12 UTC

This package is not auto-updated.

Last update: 2024-09-24 03:40:06 UTC


README

SessionMonster在Laravel中吞噬会话

为什么?

一个理论是Varnish应该始终缓存所有流量。如果

  • 响应是当前状态的“函数”
  • 状态完全由请求体定义

然而,如果发送给Varnish的请求包含任何会话cookie(如`laravelsessionid=blahblah`),并且由于Varnish无法查看Laravel会话存储系统,它必须转发所有流量 - 不缓存。

此外,如果Web服务器返回带有cookie的响应,Varnish也无法缓存响应。

理想情况下,如果没有会话存储的要求,我们的应用程序不应该启动新的会话或加载会话。如果没有创建新会话,Web应用程序不应该设置任何cookie。在这种情况下,Varnish应该积极缓存所有流量。

本项目目标是延迟设置会话cookie,直到这样做变得有意义。

例如,当一个新客户端(A)访问http://www.haifanghui.com/,然后访问http://www.haifanghui.com/a/查看所有关于澳大利亚房地产市场的新闻,在整个过程中,他的浏览器中不应该设置任何会话cookie。然而,当A访问http://www.haifanghui.com/login并登录时,应该创建一个会话 - 因为用户的ID将存储在其中。

它是如何工作的?

当SessionMonster注册自身的SessionMonsterServiceProvider时,它会向Laravel的响应钩子注入一个闭包,它会确定对于每个响应,会话存储中是否有任何有价值的会话数据。

当SessionMonster确定响应会话中没有数据时,它会将带有响应的X-No-Session: yeah头部发送出去。相应的Varnish VCL部分如下所示:

    if (beresp.http.X-No-Session ~ "yeah") {
        unset beresp.http.set-cookie;
    }

如果X-No-Session头部是yeah,这将从响应中删除所有cookie。

本项目已用于HaiFangHui.com生产站点,并且对我们很有帮助。