![如何根據特定標頭繞過清漆緩存](https://rvso.com/image/782629/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%93%9A%E7%89%B9%E5%AE%9A%E6%A8%99%E9%A0%AD%E7%B9%9E%E9%81%8E%E6%B8%85%E6%BC%86%E7%B7%A9%E5%AD%98.png)
我從兩天前就開始研究這個問題,但沒有成功。
因此,基本上,我想繞過特定傳入請求 URL 的清漆快取。
我定義了這個規則:
sub vcl_recv {
if (req.url ~ "/en/reading-books/") { return(pass); }
}
但是當我刷新頁面時,它仍然被緩存,響應標頭返回這些:
via: 1.1 varnish-v4
x-varnish: 2
這個後台運行命令會產生輸出:
varnishncsa -F '%{Host}i %h %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i"'
我在這裡缺少什麼?任何指點都非常感謝。
答案1
升級到支援的版本
在討論調試傳入 URL 的快取之前,我想指出的是您正在執行 Varnish 的終止版本,該版本存在已知的安全漏洞。
請升級至最新版本或使用 Varnish Cache 6.0 LTS。
看https://www.varnish-software.com/developers/tutorials/#installations取得各種 Linux 發行版的安裝指南清單。
符合精確的 URL 或 URL 模式
您共享的 VCL 程式碼繞過了/en/reading-books
.您是否正在嘗試對該 URL 進行精確匹配,或對匹配一組 URL 的模式進行精確匹配?
為了實現精確匹配,我將如下調整 URL:
sub vcl_recv {
if (req.url == "/en/reading-books/") {
return(pass);
}
}
當您匹配多個以 開頭的 URL 時/en/reading-books/
,我會如下調整 VCL:
sub vcl_recv {
if (req.url == "^/en/reading-books/.*$") {
return(pass);
}
}
Varnish 特定的回應頭怎麼樣
您在問題中提到了以下標題:
via: 1.1 varnish-v4
x-varnish: 2
這些表明您正在使用 Varnish,但 Varnish 不一定提供來自快取的回應。
標via
頭只是告知用戶 Varnish 是響應鏈中的代理伺服器這一事實。
標頭的值x-varnish
通常指處理您的要求的交易的 ID。
它實際上是Age
指示從快取提供回應的時間的標頭。
檢查日誌
該varnishncsa
命令可以存取 Varnish 共享記憶體日誌,但實際上並未顯示大量有用的快取資訊。
目的varnishncsa
是傳回存取日誌訊息,類似Apache和Nginx傳回的內容。
請執行以下命令來調試緩存:
varnishlog -g request -q "ReqUrl ~ '^/en/reading-books/.*$'"
varnishncsa
在產生 NCSA 格式的單行回應時,varnishlog
將傳回完整的事務。請將輸出添加到varnishlog
您的問題中,我將幫助您調試。