2011-09-11 92 views
0

恐怕我對清漆還是比較陌生的,但是我遇到了一個問題,那就是我找不到任何地方的解決方案(尚未):清漆設置爲緩存GET請求。我們有一些有很多參數的請求,我們決定在請求的主體中傳遞它們。當我們繞過Varnish但是當我們通過Varnish(用於緩存)時,這個工作正常,請求在沒有主體的情況下傳遞,所以Varnish背後的服務失敗。Varnish/VCL大師:如何通過請求身體使用Varnish獲取?

我知道我們可以使用POST,但我們希望得到的數據。我也知道,如果我們使用pass模式,Varnish可以傳遞請求體,但據我所知,在pass模式下創建的請求不會被緩存。我已經把一個哈希值放到了url中,這樣當事情有效時,我們實際上會從緩存中獲得正確的數據(只要url發送,調用就會看起來都是一樣的)。現在

的問題是「公正」如何重寫vcl_fetch對請求主體傳遞到Web服務器?任何提示和技巧歡迎!

在此先感謝

喬恩

+0

所以你想要一個請求正文的HTTP GET請求?我不認爲這是可能的,直到我在這個網站上發現一個問題:http://stackoverflow.com/questions/978061/http-get-with-request-body。這是可能的,但不推薦。我可以想象清漆不執行這種情況.... – ivy

+0

我知道這不是建議,但它允許...並幫助獲得圓的URL長度限制。清漆在通過模式下支持它,但不會緩存結果。似乎他們不支持它(但?)在獲取模式下......並且在獲取模式下,響應可以被緩存。 :(( –

回答

0

我不認爲你可以,但是,即使可以,這是非常危險的:光油不會存儲請求身體進入高速緩存或哈希表,因此它將無法看到具有相同URI和不同主體的兩個請求之間的任何區別。

我還沒有聽說過一個VCL密鑰來讀取請求主體,但是,如果存在的話,你可以通過它來req.hash者區分請求。

無論如何,請求體應該僅用於POST或PUT ...和POST/PUT請求不應該被緩存。

請求體應該將數據發送到服務器。緩存是用來獲取數據...

我不知道的細節,但我認爲在你的工藝設計問題...

+0

PS:如果你通過你的請求(VCL「通行證」事件),那麼一切都會按預期工作,但它不會被緩存。 –

0

我不知道我收到了你的問題的權利,但如果您嘗試以某種方式與請求主體進行交互,這對於VCL是不可能的。您沒有任何VCL變量/子例程來執行此操作。

你可以找到的變量VCL這裏提供的清單(或人VCL):

我高塞爾同意,你似乎有一個設計問題,在您的系統。

「希望有所幫助。

+0

鏈接已死 – jononomo