2017-04-08 77 views
0

現狀::光油:忽略一些緩存的cookie散列計算

  1. 光油需要緩存,即使在餅乾上的要求存在。
  2. 該請求可能包含N個任意Cookie,其中某些已知的Cookie不能構成緩存鍵的一部分。任意cookie不包含任何用戶敏感數據,例如。他們是化妝助手,如is_authenticated = 1。
  3. 實際的後端必須接收未緩存的原始Cookie集合,如果發生緩存未命中。
  4. 我不想檢查VCL中的URL模式,因爲它假設了對後端的太多瞭解。

這很難解決。到目前爲止,我發現的所有解決方案都爲(2)提供白名單,而我需要一個黑名單。而且大多數解決方案都會刪除應該通過後端的cookie。

+0

只是爲了確認,你想散列一些UNKNOWN cookie(不包括那些已知的cookies)? –

+0

是的,通常的哈希組件(主機,url)必須保留爲哈希的一部分。 – hedleyroos

回答

1

因此,如何(未經測試):

# We use builtin.vcl logic and 'return' from our vcl_recv in order 
# to prevent default Varnish behaviour of not caching with cookies present 
sub vcl_recv { 
    # your vcl_recv starts here 
    # ... 
    # your vcl_recv ends here 

    if (req.method == "PRI") { 
    /* We do not support SPDY or HTTP/2.0 */ 
     return (synth(405)); 
    } 
    if (req.method != "GET" && 
     req.method != "HEAD" && 
     req.method != "PUT" && 
     req.method != "POST" && 
     req.method != "TRACE" && 
     req.method != "OPTIONS" && 
     req.method != "DELETE") { 
     /* Non-RFC2616 or CONNECT which is weird. */ 
     return (pipe); 
    } 

    if (req.method != "GET" && req.method != "HEAD") { 
     /* We only deal with GET and HEAD by default */ 
     return (pass); 
    } 
    if (req.http.Authorization) { 
     /* Not cacheable by default */ 
     return (pass); 
    } 
    return (hash); 
} 

sub vcl_hash { 
    set req.http.X-Cookie-Hash = regsub(req.http.cookie, "KNOWN1=[^;]+;", ""); 
    set req.http.X-Cookie-Hash = regsub(req.http.X-Cookie-Hash, "KNOWN2=[^;]+;", ""); 
    hash_data(req.http.X-Cookie-Hash); 
} 

從而消除各知名餅乾和散列在餘:)不理想,因爲它不能保證在頭的cookie的順序,而是從其他這應該工作。

+0

這當然看起來是正確的,但仍然存在一個問題 - 清漆仍然看到cookie的存在,因此拒絕緩存。有沒有辦法改變這種行爲? – hedleyroos

+0

查看最新的答案:它有幫助嗎?) –

+0

哇,這是非常令人印象深刻的。到目前爲止,我的測試表明它完美地工作。我將把你的答案標記爲解決方案。 – hedleyroos