更新 Varnish ESI 的請求 cookie,包括來自初始 beresp
的請求
我有一個以 Varnish 伺服器為前端的應用程序。部分頁面使用 ESI 包含呈現。
我的問題是上游響應包含一個加密的會話 cookie,其中包含一個 CSRF 令牌(根本沒有伺服器端會話儲存)。
對於初始請求(請求中沒有 cookie),ESI 請求將不包含由上游伺服器的第一個響應設置的 cookie。
我已經嘗試
req.http.Cookie
在vcl_deliver
鉤子中設置,因為它是請求流中我發現兩者都可以訪問的唯一req
位置res
。但是,使用 varnishlog 查看請求會發現 ESI 請求不受影響並且不包含 cookie。我已盡我所能瀏覽文件,但找不到任何遠端有用的東西。
是否有可能實現我想要的,即更新
req
以使 ESI 請求包含初始上游響應返回的 cookie?
我們需要明確區分包含標頭的請求和包含
Cookie
標頭的響應Set-Cookie
。假設 CSRF 令牌是通過父響應的標頭設置的,您可能希望通過ESI 子請求中的請求標頭
Set-Cookie
訪問該值。Cookie
假設 Cookie 標頭已經包含 CSRF 令牌
該
req_top.http.Cookie
變數可以訪問父請求的 cookie,但在解析 ESI 佔位符的位置req_top
無法訪問。vcl_backend_response
您可以使用以下 VCL 片段繞過此限制:
sub vcl_recv { if (req.esi_level > 0 ) { set req.http.X-Parent-Cookie = req_top.http.Cookie; } }
這將啟用在through
X-Parent-Cookie
中可用的標頭。vcl_backend_response``bereq.http.X-Parent-Cookie
假設 Cookie 標頭尚未包含 CSRF 令牌
假設它
req_top.http.Cookie
還不包含 CSRF 令牌的值是現實的,因為在處理 ESI 子請求時,Cookie
客戶端尚未設置標頭。我能想到的唯一解決方案是將父
Set-Cookie
值儲存在變數中。Varnish 本身不支持變數,需要安裝官方的https://github.com/varnish/varnish-modules。您必須從原始碼編譯它。
有關API 和程式碼範例,請參閱https://github.com/varnish/varnish-modules/blob/master/src/vmod_var.vcc 。
vmod_var