2016-11-25 89 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

相關問題