2013-10-04 62 views
1

我正在嘗試使用Varnish來緩存具有一些用戶特定文本和鏈接的頁面。緩存這些頁面的最佳方式是通過Edge Side Includes如何在Varnish中操作ESI URL以包含用戶特定的上下文?

語境

我的web應用程序是基於REST的,不支持爲這一問題的會議,甚至餅乾。每個源URL都是完整的,因爲它包含用戶特定的查詢參數,以便能夠識別唯一用戶。在Web應用程序中查看大多數訪問的頁面是列表頁面。我只需要在標題中顯示用戶的電子郵件,並且頁面上的鏈接還必須提前提供用戶特定的查詢參數,以便模擬已登錄的行爲。除了標題和內部鏈接外,每個用戶的頁面內容應該是相同的。

我試着在頁面上使用<esi:include />這樣的區域,但很明顯,不能在頁面源代碼中包含用戶特定的參數(否則第一個用戶特定的命中會與第一個用戶的參數一起緩存,每個後續用戶)。此外,我試圖剝去vcl_recv Varnish子例程中的用戶特定參數,並將其臨時存儲在標題中,例如req.http.X-User之前的lookup。每個源URL都使用不包含任何用戶特定參數的req.url散列,因此不會爲每個唯一用戶創建重複的緩存對象。

問題

我想加入這個用戶對各ESI URL特定值的查詢參數讀取req.http.X-User和散列用戶特定ESI請求用戶特定參數。我沒有看到在源請求和ESI請求之間共享查詢參數的方法。有人可以幫忙嗎?

我試圖去描繪我的目標如下圖: enter image description here

+0

您是否能夠找到解決此問題的解決方案? – tmueller

回答

0

我猜你的問題是,ESI調用自身將被緩存。在URL中包含任何查詢字符串。

我不記得具體細節,但我認爲你可以讓Varnish通過ESI請求傳遞cookie,這樣你就可以將值存儲在cookie中(加密?),然後可以通過任何處理ESI呼叫。

或者你可以讓它通過HTTP標頭?在這種情況下,可以直接從HTTP頭參數中讀取

+0

ESI提取獨立於父提取,因此無法在父提取期間看到設置的標題。所以我無法接收在ESI提取中在父提取期間設置的HTTP頭。我正在尋找一種解決方案,可以在ESI請求上設置參數/標題。 – rhetonik

+0

http://stackoverflow.com/questions/17704712/varnish-and-esi-http-auth可能有用 – cowls

+0

謝謝!這在一定程度上是有用的。但是,它涉及設置固定的授權標頭。在我的情況下,標題應該從父請求本身繼承授權。我正在研究Varnish的源代碼,以瞭解更多關於允許ESI參數的信息。 – rhetonik

相關問題