Verniz - destaque e anexe os cookies

Verniz - destaque e anexe os cookies

Em primeiro lugar, peço para saber se isso é possível ou não.

Portanto, posso ver que o Varnish não armazenará objetos em cache se tiver cookies.

Estou pensando que quando uma solicitação recebida contém cookies, o Varnish irá armazená-los em variáveis ​​e removê-los, e então deixá-los passar para o back-end. Assim que o back-end terminar de processá-lo, o Varnish colocará os cookies de volta.

isso é algo possível?

se for, como é o vcl?

Responder1

Contexto

O Varnish é conservador no que diz respeito ao cache e assume que a utilização de cookies implica um nível de personalização da resposta.

Armazenar em cache uma resposta personalizada pode resultar em problemas de privacidade ou segurança. Também pode resultar em resultados inconsistentes.

Imagine armazenar em cache uma página que possui um carrinho de compras. Armazenar a página inteira em cache resultaria em todos tendo o mesmo valor de carrinho de compras.

Aqui está o comportamento VCL integrado do Varnish para cookies:

  • Quando o Varnish vê um Cookiecabeçalho na solicitação, ele não servirá o objeto do cache porque assume que o conteúdo é personalizado.

Verhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#authorization-headers-and-cookies-are-not-cacheable

  • Quando o Varnish vê um Set-Cookiecabeçalho na resposta, ele não armazena o objeto no cache porque definir um cookie é uma mudança de estado que também implica personalização.

Verhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers

Tirando biscoitos

Depois que um cookie for definido por meio do Set-Cookiecabeçalho de resposta, ele será passado como um Cookiecabeçalho de solicitação para todas as solicitações subsequentes, mesmo para páginas que realmente não precisam desses cookies.

É por isso que é importante determinar quais páginas exigem cookies e quais não. É igualmente importante identificar os cookies de rastreamento, pois são processados ​​pelo cliente em Javascript e não no servidor.

Aqui está um exemplo de VCL onde removemos todos os cookies, exceto aqueles que precisamos no servidor:

vcl 4.1;

sub vcl_recv {
    if (req.http.Cookie) {
        set req.http.Cookie = ";" + req.http.Cookie;
        set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
        set req.http.Cookie = regsuball(req.http.Cookie, ";(PHPSESSID)=", "; \1=");
        set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
        set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");
    }
    if (req.http.cookie ~ "^\s*$") {
        unset req.http.cookie;
    }
}

Neste caso apenas o PHPSESSIDcookie é mantido, pois é necessário para acompanhar os logins. Se após a lógica de substituição este cookie ainda estiver lá, o Varnish não servirá a resposta do cache. Se esse cookie não tiver sido definido, mas houver vários cookies de rastreamento, todos os cookies serão removidos e a página poderá ser servida a partir do cache.

Removendo cookies de determinadas páginas

Embora o exemplo anterior tenha removido cookies selecionados e apenas mantido o PHPSESSIDcookie, você ainda pode acabar em páginas que realmente não precisam desse cookie de sessão.

Aqui está um exemplo de VCL em que os cookies são totalmente removidos, exceto em páginas que realmente precisam de um cookie específico, como as páginas de administração e a página do carrinho de compras:

vcl 4.1;

sub vcl_recv {
    if(req.url ~ "^/admin" || req.url == "/cart") {
        return(pass);
    }
    unset req.http.Cookie;
}

Removendo cabeçalhos Set-Cookie

Como mostrado emhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers, a VCL integrada não armazenará um objeto no cache se um Set-Cookiecabeçalho for usado, porque isso implica uma mudança de estado.

No entanto, isso não significa que a página nunca irá parar no cache: a próxima resposta do back-end provavelmente não conterá o Set-Cookiecabeçalho porque o cookie já está definido. Nesse caso, a próxima resposta sem o Set-Cookiecabeçalho pode acabar no cache.

No entanto, se tiver certeza de que não precisa definir um cookie para determinadas páginas, você também pode decidir retirar o Set-Cookiecabeçalho.

O exemplo a seguir evita que um back-end configure um cookie para conteúdo estático:

vcl 4.1;

sub vcl_backend_response {
    if (bereq.url ~ "^[^?]*\.(7z|avi|bmp|bz2|css|csv|doc|docx|eot|flac|flv|gif|gz|ico|jpeg|jpg|js|less|mka|mkv|mov|mp3|mp4|mpeg|mpg|odt|ogg|ogm|opus|otf|pdf|png|ppt|pptx|rar|rtf|svg|svgz|swf|tar|tbz|tgz|ttf|txt|txz|wav|webm|webp|woff|woff2|xls|xlsx|xml|xz|zip)(\?.*)?$") {
        unset beresp.http.Set-Cookie;
    }
}

Reanexando cookies

Embora seja possível armazenar o valor do cookie em um cabeçalho e, em seguida, retirar os cookies na VCL para servi-los no cache e, finalmente, reanexá-los para solicitações de back-end, isso realmente não faz muito sentido.

Por que você enviaria cookies para uma solicitação de back-end se a resposta armazenável em cache não precisa de um cookie para criar sua saída?

Se uma solicitação de back-end precisar do valor do cookie para compor a saída, isso provavelmente significa que a resposta não poderá ser armazenada em cache, portanto, você também pode ignorar completamente o cache dessa solicitação.

Próximos passos

Como sua pergunta não era muito específica, também tive que dar uma resposta muito geral.

Se minha resposta responder totalmente à sua pergunta, convido você a especificar mais detalhes sobre seu caso de uso e, em troca, darei uma resposta mais detalhada.

informação relacionada