2016-11-25 158 views
0

我正在实现nginx作为Django项目的反向代理。现在我想实现下面的nginx的缓存配置:如果用户通过身份验证,绕过nginx缓存Django

proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:5m max_size=1g inactive=60m; 
proxy_temp_path /var/cache/nginx/tmp; 

server { 
    ... 

    location/{ 
    proxy_pass http://127.0.0.1:8000; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"'; 

    # cache 
    proxy_cache my_cache; 
    proxy_cache_min_uses 1; 
    proxy_cache_valid 200 302 10m; 
    proxy_cache_valid 404 1m; 
    proxy_ignore_headers X-Accel-Expires Expires Cache-Control; 
    proxy_cache_use_stale error timeout invalid_header http_500 http_502 http_503 http_504; 
    proxy_cache_lock on; 

    proxy_hide_header "Set-Cookie"; 

    add_header X-Proxy-Cache $upstream_cache_status; 
    } 
} 

所有的伟大工程,但我想它,以便验证的用户能够绕过缓存,否则当他们更新网站的内容,他们赢了不会看到更改,只有缓存的内容才会到期。

什么是最好的方法来解决这个问题?

任何帮助将不胜感激。

感谢

+0

缓存动态内容几乎总是一个坏主意 – e4c5

+0

网站并不是非常动态的,只是当管理员进行更新时,进行修改的用户将无法查看更新,直到缓存过期(或者他们在url栏中输入nocache)。 – tdsymonds

+0

你每天获得多少页面浏览量 – e4c5

回答

0

添加一个中间件来设置cookie的(如cachedisable)响应,如果用户autheticated否则删除的cookie。所以,你可以把$cookie_ cachedisable在nginx的的c​​onf

location/{ 
    proxy_cache_bypass $cookie_cachedisable $arg_nocache; 
    ... 
} 

每当你想绕过缓存不喜欢

http://www.example.com/?nocache=true #or if cookie `cachedisable` is present 

请求欲了解更多信息https://www.nginx.com/blog/nginx-caching-guide/?utm_source=nginx-caching-guide&utm_medium=blog#caching-guide-faq-hole-punch

+0

感谢您的帮助,我了解您可以使用查询字符串绕过缓存,但是对于用户必须记住在他们更改某些内容时添加查询字符串真的很理想。我希望有更多的自动化解决方案 – tdsymonds

+0

如果这是nginx唯一可行的解​​决方案,那么有没有办法让Django中的某些中间件在用户通过身份验证时总是添加查询字符串。谢谢 – tdsymonds

+0

在django默认情况下,会有经过认证的用户的'sessionid'。您可以将'$ cookie_nocache'更改为'$ cookie_sessionid'。在查询字符串中不需要'cache = true'。简而言之,您可以通过查询字符串或cookie绕过nginx缓存。 – itzMEonTV

相关问题