我注意到我的每站点缓存不起作用,因为页面响应标头包括:
Vary:Cookie
由于我安装了谷歌分析,它将在每次加载页面时更新cookie,这会使缓存无法使用。
我不确定是否已将Vary:Cookie隐式添加到页面响应标头或来自哪里。任何帮助赞赏。
Django 1.3.1
更新:
事实证明,当包含session
中间件并访问session
时,它会向响应中添加Vary:Cookie
标头。在我的情况下,原因是第三方应用正在访问会话。
答案 0 :(得分:4)
问题并没有真正表达为问题:)但我想我会指出一些事情。
Django cache is not sensitive to cookies by default。但你可以通过设置vary_on_*
装饰器来告诉他。
这意味着您正在谈论的每站点缓存是另一回事 - 您提到谷歌分析,但不清楚与缓存本身有何关联。
因此你可能(?)有一些前面的缓存。
如果您要使用nginx或varnish,则可以自定义vary
影响缓存的方式,使用nginx,您也可以将其从响应中删除,以便客户端没有收到它(包括谷歌分析)。
如果您只是想让javascript看不到会话Cookie,则会有一个特定的设置:SESSION_COOKIE_HTTPONLY
。
您应该使用per-url-pattern策略,通过使用或忽略Vary和Expire标头,使缓存行为适应依赖或不依赖于登录用户的页面。
<强> [编辑] 强>
如果您使用nginx作为前端并希望使用它进行缓存,那么使用强制缓存不需要cookie的视图的方法非常简单:
location /yourpath/ {
proxy_cache cache_name;
proxy_ignore_headers Set-Cookie;
proxy_cache_valid 200 1d; # how long the nginx cache will last
proxy_cache_key "$host$request_uri$cookie_user"; # you can still use /one/ cookie for your cache!
...
proxy_pass @namedlocation;
}
您需要定义缓存,以获取更多信息结帐:https://serverfault.com/questions/30705/how-to-set-up-nginx-as-a-caching-reverse-proxy
使用uwsgi非常相似的设置,只是它们是前缀uwsgi;结帐uwsgi doc,但考虑到它比我开始的“代理”文档更简洁。作为一个例子。
如果您想完全“删除”Cookie,您可以:
location /path/ {
proxy_hide_header Set-Cookie;
}
但我不确定这是你想要做的!
另一方面,如果您想更好地控制浏览器的缓存,可以根据需要重新设置vary头:
location /path/ {
proxy_hide_header Vary;
}
您甚至可以将其重置为其他内容:
add_header Vary User-Agent;