删除匿名 session cookies php

remove anonymous session cookies php

我正在使用

session_start();

在我的 PHP 脚本的开头。我最近安装了清漆来做一些缓存,所以我希望 PHPSESSID 在用户匿名(或未登录)时消失。

我想在我的 PHP 脚本(在响应 header 中)设置一个自定义 header 如果用户没有登录,并缓存这些页面。但我不认为这会起作用,因为 Cookie 在请求中 header,如果我理解正确,这就是清漆不缓存的原因。

我该如何解决这种情况?删除匿名用户的请求 cookie 似乎是理想的选择。

这里涉及到几个因素,所以请原谅我为了完整而不够简洁。首先,session_destroy() 仅删除 server-side session 数据,而不是 PHPSESSID cookie(或现有响应 header 请求设置 session 饼干)。如果客户端上已经存在任何 cookie,还需要调用 setcookie() 命令以用另一个已经过期的 cookie 覆盖 PHPSESSID cookie,这将导致浏览器删除 cookie在 http 请求处理之后,尽管 PHPSESSID cookie 仍然存在于当前请求中这一事实无济于事,但停止了 Varnish。如果您可以追逐每个带有条件的 session_start() 命令以销毁它并在响应到达客户端之前从响应中删除 set-cookie header 那么这可能会起作用,但这是一个非常不稳定 band-aid。也可以覆盖 PHP 的 session 处理,以便整个 session_start 过程有条件地进行,但这也是一个粗略的补丁(更多信息:http://php.net/manual/en/class.sessionhandler.php

Varnish 确实有一些关于选择性绕过某些 cookie 的文档(主要与 Google Analytics cookie 一起使用): https://www.varnish-cache.org/docs/3.0/tutorial/cookies.html 问题在于,从 Varnish 的角度来看,它无法区分填充的 PHP session 与空的,因此即使登录的人也会从 Varnish 获得缓存页面。我建议,让 Varnish 忽略 PHPSESSID cookie,但在正确登录时设置一个额外的 cookie,Varnish 未设置为绕过该 cookie,以便这些请求将传递到后端。