如何根據特定標頭繞過清漆緩存

如何根據特定標頭繞過清漆緩存

我從兩天前就開始研究這個問題,但沒有成功。

因此,基本上,我想繞過特定傳入請求 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您的問題中,我將幫助您調試。

相關內容