2012-08-26 52 views
2

我有一個PHP頁面,可以用Varnish緩存:http://categories.php?name=NAME。 它有一些ESI腳本,如:< ESI:包括SRC =「/ esi.php」 />可以清漆ESI腳本獲取(源頁)上的頁面?

的所有頁面都具有相似的頁眉,頁腳,側邊欄,所以我刪除名稱= NAME做VCL哈希時,因此所有頁面可以獲得相同的緩存。

問題是我想在esi.php腳本里面知道哪個頁面發出了ESI請求。它是categories.php?name = A或categories.php?name = B?

我該怎麼做?我沒有在任何地方找到這些信息。

我在想它可能在HTTP REFERER中,但事實並非如此。 :(

+0

會更好,如果你粘貼'vcl'內容文件。 –

+0

你有沒有找到這個問題的解決方案? –

回答

1

試試這個在vcl_recv:

if (req.esi_level == 0) { 
    set req.http.X-Esi-Parent = req.url; 
} 

這將導致與此相關的主請求被稱爲「X-ESI-父」請求頭中發送原始URL的所有ESI請求可讀取。在後端

更新

亞歷山大在評論中正確地指出,這是不行的,因爲在vcl_recv設置頭不存在後續ESI要求 - 只有頭來回客戶。有幾個人問的羣發類似的問題沒有被回答:

https://www.varnish-cache.org/lists/pipermail/varnish-misc/2012-February/021706.html

http://marc.info/?l=varnish-dev&m=135273366517518&w=2

因此,似乎沒有辦法,如果你希望緩存包含ESI標記的響應要做到這一點跨所有查詢字符串組合。

+0

這不起作用。清漆將嘗試ESI的新要求。在原始請求期間設置的所有請求標頭都將丟失。 –

+0

@AleksandarJanković你說得對,我會更新我的答案。 –

2

同樣的問題,相同的狀態。爲了解決這個問題,我添加父URL作爲參數傳遞給ESI網址:

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" /> 
0

Varnish 4.1開始,你可以這樣做:

if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") { 
    ... 
}