2014-01-11 186 views

回答

3

由於X-UA-Device不適用於客戶端請求或任何下游代理(它在Varnish內部生成),因此您必須根據原始Vary標頭進行更改。

0

雖然X-UA-Device變化是不正確的下游緩存,光油本身仍然可以從優化中受益,如果你重寫vcl_deliver Vary標頭:

sub vcl_deliver { 
    if (resp.http.Vary) { 
     set resp.http.Vary = regsub(resp.http.Vary, 
            "(?i)X-UA-Device", 
            "User-Agent"); 
    } 
} 

這樣,光油改變其高速緩存上X-UA-Device和下游緩存在User-Agent上有所不同。

在您提出的問題中,您提到您正在將X-UA-Device添加到響應標題以及請求標頭中。在這種情況下,上述建議將無法正常工作,你反而會需要發送Vary: User-Agent無條件:

sub vcl_fetch { 
    set beresp.http.X-UA-Device = req.http.X-UA-Device; 
    if (!beresp.http.Vary) { 
     set beresp.http.Vary = "User-Agent"; 
    } elsif (beresp.http.Vary !~ "(?i)User-Agent") { 
     set beresp.http.Vary = beresp.http.Vary + ", User-Agent"; 
    } 
} 

(我不知道你是否在設置X-UA-Device響應頭的客戶端腳本的好處,或者希望它可以被下游緩存識別。)

+0

我認爲這是不正確的,因爲Varnish本身已將對象存儲在緩存中後調用了vcl_deliver。如果你想緩存不同版本的同一個URL,你應該使用'vcl_hash' – NITEMAN

+0

這個想法是讓應用程序在響應頭中發送'Vary:X-UA-Device'。 Varnish將存儲該Vary頭的版本,並根據該版本做出命中/未命中的決定。 (Varnish _does_表示Vary頭部,因此不需要額外的'vcl_hash'邏輯。)在'vcl_deliver'中將響應頭重寫爲'Vary:User-Agent'確保任何下游緩存都能正常工作。 (注意:我已經測試過,並確認它適用於Varnish 3.0.5) –

+0

如果設備檢測在清漆外部(在應用程序中)執行,如果您在清漆內執行檢測(如在原始問題中)照顧'vcl_deliver'上的Vary頭部,如下所示:'if(resp.http.Vary){set resp.http.Vary = resp.http.Vary +「,User-Agent」; } else {set resp.http.Vary =「User-Agent」; }' – NITEMAN

相關問題