haifanghui / session-monster
一个吞噬会话cookie的怪物 - 与Varnish + Laravel兼容
Requires
- php: >=5.4.0
- illuminate/support: 4.2.*
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生产站点,并且对我们很有帮助。