簡體   English   中英

使用Cookie標頭使Varnish忽略請求

[英]Make Varnish ignore requests with Cookie header

清漆默認行為是永遠不會查找包含Cookie標頭的請求。 換句話說,永遠不會緩存包含Cookie標頭的請求。 我需要覆蓋此行為以忽略具有Cookie標頭的請求。

考慮我的應用程序中的下一個用戶行為:

  1. 用戶進入應用程序主頁( / ),頁面應該被緩存,后端返回一個public緩存控件,一切都很好,頁面被Varnish緩存。
  2. 用戶導航到/not-cacheable的自定義頁面( /not-cacheable ),后端返回private緩存控件。 還在響應中返回Set-Cookie標頭。 Varnish忽略了這個請求,用戶最終得到了一個cookie。 到現在為止還挺好。
  3. 用戶導航回主頁( / ),記住,已經緩存了主頁。 問題是,用戶請求現在帶有Cookie標頭。 這會導致Varnish忽略該請求並委托給后端。

刪除Cookie 將不起作用,因為當用戶返回/not-cacheable路由時,他將看不到他的個性化頁面,因為Cookie標頭已被條帶化。 相反,后端返回一個新生成的會話,其中包含Set-Cookie的新ID。

此外,讓每個Cookie請求在Varnish中查找都會導致每個請求(有關方法或后端響應)被緩存。

如果有一種方式告訴Varnish只是忽略Cookie標頭,這樣我就可以通過讓后端決定請求是否應該是可緩存的來緩存具有該標頭的請求。

有任何想法嗎?

為了記錄,我終於想出了一個VCL腳本,它使用自定義標頭解決了這個問題並重新啟動了請求:

backend default
{
    .host = "127.0.0.1";
    .port = "8080";
}

sub vcl_recv
{
    if(req.http.X-Force-Backend)
    {
        return(pass);
    }

    if(req.http.Cookie && req.request ~ "(GET|HEAD)")
    {
        set req.http.X-Cookie = req.http.Cookie;
        remove req.http.Cookie;

        return(lookup);
    }
}

sub vcl_deliver
{
    if(resp.http.Cache-control ~ "(private|no-cache|no-store)" 
        && !req.http.X-Force-Backend
        && req.request ~ "(GET|HEAD)"
    )
    {
        set req.http.X-Force-Backend = "YES";
        set req.http.Cookie = req.http.X-Cookie;

        remove req.http.X-Cookie;

        return(restart);
    }
}

如您所見,通過始終刪除Cookie標頭並在我們從后端獲得不可緩存的響應時重新啟動請求,我們可以實現所需的效果。 我不知道可能的性能缺點,但我在生產中使用它並且它工作得很好。

我還寫了一篇關於這個特定問題的博客文章,如果有人使用Symfony和Varnish,它可能會很有趣: http//albertofem.com/post/symfony-varnish-and-http-practical-considerations.html

我認為刪除vcl_recv的cookie頭應該可以解決問題,這是我在wordpress上用來忽略前端而不是后端的東西,你可以輕松刪除if條件使其在整個服務器上運行

sub vcl_recv {
  if (req.url !~ "^/wp-"){
    unset req.http.cookie;
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM