Absolutamente; a manipulação do verniz de X-Forwarded-For
é, na verdade, apenas definida na função vcl_recv
padrão.
if (req.restarts == 0) {
if (req.http.x-forwarded-for) {
set req.http.X-Forwarded-For =
req.http.X-Forwarded-For + ", " + client.ip;
} else {
set req.http.X-Forwarded-For = client.ip;
}
}
A definição padrão de uma função é sempre anexada a uma que você definiu em seu arquivo VCL ativo, mas se sua função definida sempre lida com uma solicitação, a lógica padrão nunca será executada.
Defina um vcl_recv
ao longo destas linhas:
sub vcl_recv {
/* Your existing logic goes here */
/* After that, we'll insert the default logic, with the X-Forwarded-For handling removed */
/* The return (lookup); at the end ensures that the default append behavior won't have an impact */
if (req.request != "GET" &&
req.request != "HEAD" &&
req.request != "PUT" &&
req.request != "POST" &&
req.request != "TRACE" &&
req.request != "OPTIONS" &&
req.request != "DELETE") {
/* Non-RFC2616 or CONNECT which is weird. */
return (pipe);
}
if (req.request != "GET" && req.request != "HEAD") {
/* We only deal with GET and HEAD by default */
return (pass);
}
if (req.http.Authorization || req.http.Cookie) {
/* Not cacheable by default */
return (pass);
}
return (lookup);
}
Editar:
Como o Varnish lida com algumas conexões diretamente, uma abordagem melhor pode ser tê-lo definido seletivamente no cabeçalho. Você ainda deseja incluir o vcl_recv
completo para que o padrão não aplique seu próprio cabeçalho, mas inclua isso na parte superior:
if (req.restarts == 0) {
if (!req.http.x-forwarded-for) {
set req.http.X-Forwarded-For = client.ip;
}
}