我有一个依赖 session 和Cookie的网站。我想在其上实现Varnish缓存。
curl -I domainname
,我通过终端命中了此命令。 header 在每个HIT上为提供了不同的PHPSESSIONID ,AGE的值也保持为0。无法完全确定Varnish不允许网站缓存的内容。
只是为了测试我
commented the session_start()
,这是以下观察结果。在浏览器上
在终端上
看来Varnish无法缓存浏览器的点击量。特别是在指定域时。
任何帮助如何使 Varnish 缓存适用于基于 session 的网站?
最佳答案
Varnish不会缓存默认情况下设置cookie的页面。有两种方法可以解决此问题:
// ... default.vcl
sub vcl_recv {
unset req.http.Cookie;
return(hash);
}
// ... default.vcl
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
hash_data(req.http.Cookie);
return(lookup);
}
您可能有一些页面似乎没有用户特定的内容(例如,您有一个博客,博客文章不需要用户特定的内容),但是您可能有一些指示用户是否已登录的页面。如果您可以通过AJAX将其实现到非缓存的或按 session 缓存的端点,则一切正常。
使用选项2,您可能会发现需要将Cookie临时存储在另一个 header 中,这样Varnish才能真正缓存该页面,您可以这样做:
// ... default.vcl
sub vcl_recv {
set req.http.X-Cookie = req.http.Cookie;
unset req.http.Cookie;
return(hash);
}
然后,只需将
vcl_hash
函数更改为使用req.http.X-Cookie
而不是req.http.Cookie
即可。
关于php - Codeigniter : Varnish and Cookie/Session conflict,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29793100/