Varnish

更新 Varnish ESI 的請求 cookie,包括來自初始 beresp 的請求

  • March 18, 2022

我有一個以 Varnish 伺服器為前端的應用程序。部分頁面使用 ESI 包含呈現。

我的問題是上游響應包含一個加密的會話 cookie,其中包含一個 CSRF 令牌(根本沒有伺服器端會話儲存)。

對於初始請求(請求中沒有 cookie),ESI 請求將不包含由上游伺服器的第一個響應設置的 cookie。

我已經嘗試req.http.Cookievcl_deliver鉤子中設置,因為它是請求流中我發現兩者都可以訪問的唯一req位置res。但是,使用 varnishlog 查看請求會發現 ESI 請求不受影響並且不包含 cookie。

我已盡我所能瀏覽文件,但找不到任何遠端有用的東西。

是否有可能實現我想要的,即更新req以使 ESI 請求包含初始上游響應返回的 cookie?

我們需要明確區分包含標頭的請求和包含Cookie標頭的響應Set-Cookie

假設 CSRF 令牌是通過父響應的標頭設置的,您可能希望通過ESI 子請求中的請求標頭Set-Cookie訪問該值。Cookie

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;
   }
}

這將啟用在throughX-Parent-Cookie中可用的標頭。vcl_backend_response``bereq.http.X-Parent-Cookie

假設它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

引用自:https://serverfault.com/questions/1096429