Pergunta

Quero usar verniz para armazenar em cache certas páginas, mesmo na presença de cookies. Existem 3 possibilidades que eu preciso cuidar de:

  1. Um usuário anônimo está visualizando alguma página
  2. Um usuário conectado está visualizando uma página com personalização de luz. Essas personalizações são todas armazenadas em um cookie assinado e são preenchidas dinamicamente pelo JavaScript. O cabeçalho Vary-Cookie HTTP não está definido.
  3. Um usuário conectado está visualizando alguma página com dados personalizados do banco de dados. O cabeçalho Vary-Cookie HTTP está definido.

Os comportamentos esperados seriam:

  1. Cache a página. Este é o cenário mais básico para o Varnish lidar.
  2. Cache a página e não exclua o cookie porque alguma lógica de JavaScript precisa dela.
  3. Nunca cache esta página porque o Vary-Cookie está sinalizando o conteúdo do cookie afetará a saída desta página.

Eu li alguns documentos sobre verniz e não sei dizer se esse é o comportamento padrão ou se há alguma configuração que eu tenho que fazer no VCL para que isso aconteça.

Foi útil?

Solução

Somente as sessões são exclusivas para todos os clientes, não necessariamente cookies.

O que você quer faz sentido e é possível com o verniz, é apenas uma questão de elaborar cuidadosamente seu próprio VCL. Por favor, preste atenção às seguintes partes do padrão.vcl:

sub vcl_recv {
    ...
    if (req.http.Authorization || req.http.Cookie) {
      /* Not cacheable by default */
      return (pass);
    }
}


sub vcl_hit {
    if (!obj.cacheable) {
        return (pass);
    }
    ...
}


sub vcl_fetch {
    if (!beresp.cacheable) {
        return (pass);
    }
    if (beresp.http.Set-Cookie) {
        return (pass);
    }
    ...
}

Você deve substituir essas peças por sua própria lógica; ou seja, defina suas próprias funções VCL_. Por padrão, solicitações (vcl_recv) e respostas (vcl_fetch) com cookies não são armazenados em cache. Você conhece melhor o seu aplicativo de back-end e deve reescrever a lógica genérica de cache para este caso específico. Ou seja, você deve definir, caso em que o verniz faça uma pesquisa, passe ou entrega.

No seu caso, você terá páginas (casos 1 e 2) sem um cookie variado, que será armazenado em cache e compartilhado por todos (solicitações com/sem cookies); Só não se importe com req.http.cookie em vcl_recv. Eu não cache as páginas (caso 3) com um biscoito variado-ou pelo menos não por um longo tempo-, pois eles não podem ser compartilhados; Faça um 'passe' em vcl_fetch.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top