Ignorando parâmetros GET no verniz VCL

3

Ok: eu tenho um site configurado com algumas APIs que expomos aos desenvolvedores, que estão no formato

/api/item.xml?type_ids=34,35,37&region_ids=1000002,1000003&key=SOMERANDOMALPHANUM

Neste URI, type_ids é sempre definido, region_ids e key são opcionais.

O importante é notar que a variável-chave não afeta o conteúdo da resposta. Ele é usado para rastreamento interno de solicitações, para que possamos identificar pessoas que fazem solicitações lentas ou indesejadas.

No verniz, temos uma VCL assim:

if (req.http.host ~ "the-site-in-question.com") {
  if (req.url ~ "^/api/.+\.xml") {
    unset req.http.cookie;
  }
}

Nós apenas retiramos os cookies e deixamos o backend fazer o resto até onde as vezes estão em questão (isso é um hackaround desde que o Rails / authlogic envia cookies de sessão com respostas da API).

No momento, porém, qualquer desenvolvedor distinto está basicamente atingindo diferentes caches, pois &key=SOMEALPHANUM é considerado como parte do hash Varnish para armazenamento. Isso obviamente não é uma ótima solução e estou tentando descobrir como dizer ao Varnish para ignorar essa parte do URI.

    
por JamesHarrison 13.02.2010 / 13:08

3 respostas

5

Se você precisar deixar o key=SOMEALPHANUM int no back-end, caso não seja entregue a partir do cache, talvez seja melhor usar regsub na função vcl_hash , porque isso não vai alterar a url, mas em vez disso apenas altera o hash da chave.

sub vcl_hash {
  if(req.http.host ~ "the-site-in-question.com" & req.url ~ "^/api/") {
    set req.http.X-Sanitized-URL = req.url;
    set req.http.X-Sanitized-URL = regsub(req.http.X-Sanitized-URL, "&key=[A-Za-z0-9]+", "");
    set req.hash += req.http.X-Sanitized-URL;
  } else {
    set req.hash += req.url;
  }
  set req.hash += req.http.host;
  hash;
}
    
por 17.11.2010 / 09:09
2

em vcl_recv

defina req.url = regsub (req.url, "& key =. * $", "");

    
por 16.03.2010 / 18:32
1

Semelhante à resposta de cd34, mas levando em conta a possibilidade de ordens diferentes para os parâmetros de consulta e confiando no fato de que o problema define o valor como alfanumérico:

set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", ""); 

(Eu não posso comentar ainda, caso contrário, isso seria um comentário sobre a resposta do cd34)

    
por 29.03.2010 / 10:12