2011-03-21 118 views
8

我有一個基本的PHP頁面通過Varnish加載一個ESI包括回調到服務器來設置一個cookie。該cookie設置了域訪問等,但通過ESI調用時,cookie從未設置。如果您直接訪問ESI包含路徑,則設置cookie不會有任何問題。我甚至把我的Varnish配置設置爲永不緩存任何東西,認爲VCL可能會殺死cookie。如何從ESI:include腳本中設置cookie?

這...

<esi:include src="/init.php?<?=http_build_query($_GET); ?>"></esi:include> 

...包括這個...

<?php 
header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 

setcookie('superman', 'clark kent', 0, '/', '.whatever.com'); 

?> 

我是新清漆和ESI,所以我開始懷疑這是否是一個已知的限制(無論是ESI還是Varnish的ESI實施),但我無法在網上找到有關我的問題的任何討論。

回答

13

一個有趣的問題已被問 - 但沒有回答 - 之前(Setting Cookies via ESI:include, how?)。我不認爲你可以這樣做。使用ESI-include,ESI處理器發出一個單獨的請求,並從身體中取代部分,而不是頭部。爲了使您的首選設置cookie行爲正常工作,ESI規範應指定如何「合併」所有set-cookie標頭。

見的ESI規範的第六章:http://www.w3.org/TR/esi-lang

當處理一個ESI模板,一個 單獨的請求將需要進行 每個包括遇到。 實施時可能會使用原始的 請求的標頭(例如,Cookie, 用戶代理等)。 此外,來自 片段(例如,設置Cookie,服務器, 緩存控制,最後修改)的響應頭可以被忽略,並且不應該影響組裝的頁面 。

你可以嘗試在javascript set-cookie腳本中轉換你的set-cookie頭嗎?這可以包括在身體...

+0

吸。 是的,我可以去javascript路由設置cookie,但我希望不必因爲各種原因這樣做。 我想我會繼續試圖找到一種可能的方法來破解這個,但我不確定現在可能,特別是在光油ESI實施在光油。 – 2011-03-21 15:29:08