Varnish - Cookie

3

Eu tenho a seguinte situação:

No meu site, o javascript define um cookie que contém informações relevantes para gerar a marcação.

Por isso, quero que o Varnish armazene em cache cada página separadamente para cada valor do referido cookie.

Toda a documentação que encontrei diz que o Varnish não armazenará em cache se houver algum cookie presente e explica como remover cookies no pré-processamento de verniz.

Isso obviamente não é o que eu quero, eu quero armazenar em cache, mesmo que um determinado cookie esteja presente, mas separadamente para cada valor do cookie.

Qualquer maneira de conseguir isso?

    
por theduke 21.03.2013 / 11:48

2 respostas

2

Isso é possível

Por exemplo:

sub vcl_recv {
        set req.http.X-COOKIEHASH = "";
        if (req.http.Cookie ~ "COOKIEHASH=") {
                set req.http.X-COOKIEHASH = regsub(req.http.Cookie,"^.*?COOKIEHASH=([^;]*);*.*$", "");
                /* to prevent default action when cookies are present */
                /* this is shortcut - you should adjust this to your VCL logic */
                return (lookup);
        }
}
sub vcl_hash {
        hash_data(req.http.X-COOKIEHASH);
}
sub vcl_miss {
        unset bereq.http.X-COOKIEHASH;
}
sub vcl_pass {
        unset bereq.http.X-COOKIEHASH;
}

Em vcl_recv () extraímos valor para cookie (com o nome COOKIEHASH) e em vcl_hash () adicionamos esse valor à função hash.

Este é um exemplo para um cookie. Mas é fácil adicionar mais nomes de cookies. Você também deve se lembrar de lidar com outros cookies (descarte-os ou ignore).

    
por 21.03.2013 / 12:54
1

Isso começou como um comentário sobre a resposta do RJS - mas está ficando um pouco longo ...

IIRC (não faz muita coisa com Varnish) você precisa especificar all os determinantes da unicidade em vcl_hash - daí a resposta do RJS pode estar errada - na verdade o exemplos do manual usam explicitamente o URL e outros indicadores.

Eu acho que há também alguns problemas com a maneira como o extrato do cookie do RJS . Supondo que o valor do cookie esteja em req.http.X-COOKIEHASH, a solução seria:

sub vcl_hash {
    hash_data(req.url);
    hash_data(req.http.X-COOKIEHASH);
}

Uma conseqüência disso é que o Varnish começará a armazenar em cache cópias de conteúdo que não estão variando com o cookie - portanto, talvez você queira excluir URLs de conteúdo estático do uso do (s) cookie (s) para determinar o hash.

No entanto, isso não ajuda a resolver o problema de outros caches - intermediário e navegador. O conteúdo deve ser exibido com um cabeçalho Vary: Cookie. Veja também a discussão aqui

    
por 21.03.2013 / 13:20