我正在使用類似varnish-devicedetect的設備按設備分組用戶代理,並在請求和響應中存儲結果X-UA-Device
。我看過幾個recommendations to vary on User-Agent。任何理由不要改變X-UA-Device
?似乎它對下游緩存更好。我可以自定義標題嗎?
7
A
回答
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
響應頭的客戶端腳本的好處,或者希望它可以被下游緩存識別。)
相關問題
- 1. 我可以在perlpod文檔中嵌入自定義標題嗎?
- 2. 我可以自定義繪製Jface TableColumn標題嗎?
- 3. 可以自定義Google +1圖標嗎?
- 4. 我可以自定義Google Map嗎?
- 5. 我可以自定義UIDatePicker嗎?
- 6. 我可以自定義我的iOS應用程序PNS標題和按鈕嗎?
- 7. 我可以在「Accept-Ranges」標題中指定自定義範圍類型嗎?
- 8. 可以用cloudflare添加自定義標題嗎?
- 9. 我可以定義我的自定義CSS媒體嗎?
- 10. 我可以在HTTP標頭中傳遞自定義數據嗎?
- 11. 我可以自定義UITableView中的複選標記位置嗎?
- 12. 我可以將自定義格式標記添加到MediaWiki嗎?
- 13. 我可以添加自定義指標嗎?bluemix石墨
- 14. 我可以在UITableView中自定義節標題嗎? (字體,圖片...)
- 15. 我可以將自定義標題添加到導出的Excel文件嗎?
- 16. 我可以使用hashbang(#!)URL向ajax powered網站添加自定義標題嗎?
- 17. 我可以使用自定義攝像頭覆蓋自定義相機控制按鈕的標題嗎?
- 18. 我們可以爲門戶定義自定義權限嗎?
- 19. 我可以創建自定義plist結構定義嗎?
- 20. 我可以自定義Monotouch.dialog
- 21. 我們可以自己創建自定義sdk嗎
- 22. 我可以爲我的自定義LINQPad數據上下文驅動程序提供自定義圖標嗎?
- 23. 我可以在Android Box中安裝我的自定義APK嗎?
- 24. 我可以自定義我的默認Beaker筆記本嗎?
- 25. 我可以從PowerShell訪問我的自定義.NET類嗎?
- 26. 我可以註冊/觸發我的自定義事件嗎?
- 27. PHP數組,我可以定義我自己的Array類嗎?
- 28. 自定義DataProvider類可以暴露自定義模板嗎?
- 29. 可以自定義相機固件嗎?
- 30. C#中的NotifyIcon.ShowBalloonTip可以自定義嗎?
我認爲這是不正確的,因爲Varnish本身已將對象存儲在緩存中後調用了vcl_deliver。如果你想緩存不同版本的同一個URL,你應該使用'vcl_hash' – NITEMAN
這個想法是讓應用程序在響應頭中發送'Vary:X-UA-Device'。 Varnish將存儲該Vary頭的版本,並根據該版本做出命中/未命中的決定。 (Varnish _does_表示Vary頭部,因此不需要額外的'vcl_hash'邏輯。)在'vcl_deliver'中將響應頭重寫爲'Vary:User-Agent'確保任何下游緩存都能正常工作。 (注意:我已經測試過,並確認它適用於Varnish 3.0.5) –
如果設備檢測在清漆外部(在應用程序中)執行,如果您在清漆內執行檢測(如在原始問題中)照顧'vcl_deliver'上的Vary頭部,如下所示:'if(resp.http.Vary){set resp.http.Vary = resp.http.Vary +「,User-Agent」; } else {set resp.http.Vary =「User-Agent」; }' – NITEMAN