2017-09-03 81 views
0

在端口80上使用varnish 5.1的多個網站設置上,我不想緩存所有域。 這很容易在vcl_recv中完成。varnish vcl_backend_response檢測vcl_recv返回(散列)

if (req.http.Host == "cache.this.domain.com") { 
    return(hash); 
} 

return(pass); 

現在在vcl_backend_response我想對緩存域進行一些處理。 (bereq.http.Host ==「cache.this.domain.com」),但有沒有辦法知道它是返回(散列)還是返回(通過)從vcl_backend_response中調用vcl_recv?

我認爲這可能是有道理的,但無法找到信息。

感謝您的幫助。

回答

0

這真的讓我想知道爲什麼你首先需要這樣的處理。

我不認爲有辦法直接告訴你如何登陸到vcl_backend_response。所以,我想你可以設置一個標誌,並且後來檢查,即:

sub vcl_recv { 
    if (req.http.Host == "cache.this.domain.com") { 
     set req.http.return_type = "hash"; 
     return(hash); 
    } 
    set req.http.return_type = "pass"; 
    return(pass); 
} 

sub vcl_backend_response { 
    if(bereq.http.return_type == "pass") ... 
} 
+0

我會接受你的答案。我希望能有更優雅的方式。我想緩存在vcl_backend_response後端錯誤,只爲那些通過哈希進入重新啓動查詢掛鉤到永久fail_be試圖從緩存釣魚。謝謝。 –

1

除了通過@Daniel五,這可能滿足您的需求的替代建議特設的做法是:

sub vcl_backend_response { 
    if (!bereq.uncacheable) { 
     ... 
    } 
} 

這讓我們執行僅用於可緩存對象的額外處理。

+0

不確定他的不可緩存是通過 –

+1

將'bereq.uncacheable'設置爲'true'(這是一個只讀變量)在客戶端的通行證中或者在HFP對象上觸發。正如我所說,這取決於你的具體需求,可能會在你的使用案例中不起作用。 –

+0

我會試試這個,讓你知道。謝謝。我只是希望如果以前的請求返回503(不正確的後端時間,幾秒鐘後吐出幾個空的響應,並重新啓動以儘早讓後端改變它的想法),則不會設置爲true –