Django每站点缓存和Vary:Cache

时间:2011-11-28 09:02:51

标签: django caching nginx django-views

我注意到我的每站点缓存不起作用,因为页面响应标头包括:

Vary:Cookie

由于我安装了谷歌分析,它将在每次加载页面时更新cookie,这会使缓存无法使用。

我不确定是否已将Vary:Cookie隐式添加到页面响应标头或来自哪里。任何帮助赞赏。

Django 1.3.1

更新:

事实证明,当包含session中间件并访问session时,它会向响应中添加Vary:Cookie标头。在我的情况下,原因是第三方应用正在访问会话。

1 个答案:

答案 0 :(得分:4)

问题并没有真正表达为问题:)但我想我会指出一些事情。

Django cache is not sensitive to cookies by default。但你可以通过设置vary_on_*装饰器来告诉他。

这意味着您正在谈论的每站点缓存是另一回事 - 您提到谷歌分析,但不清楚与缓存本身有何关联。

因此你可能(?)有一些前面的缓存。

如果您要使用nginxvarnish,则可以自定义vary影响缓存的方式,使用nginx,您也可以将其从响应中删除,以便客户端没有收到它(包括谷歌分析)。

如果您只是想让javascript看不到会话Cookie,则会有一个特定的设置:SESSION_COOKIE_HTTPONLY

您应该使用per-url-pattern策略,通过使用或忽略Vary和Expire标头,使缓存行为适应依赖或不依赖于登录用户的页面。

<强> [编辑]

使用Nginx进行缓存

如果您使用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;