En primer lugar, pregunto si esto es posible o no.
Entonces, puedo ver que Varnish no almacenará en caché los objetos si tiene cookies.
Estoy pensando en que cuando una solicitud entrante tiene cookies, Varnish las almacenará en variables y las eliminará, y luego las dejará pasar al backend. Una vez que el backend termine de procesarlo, Varnish devolverá las cookies.
¿Es esto algo que es posible?
Si es así, ¿cómo se ve el vcl?
Respuesta1
Contexto
Varnish es conservador en cuanto al almacenamiento en caché y asume que el uso de cookies implica un nivel de personalización de la respuesta.
Almacenar en caché una respuesta personalizada podría generar problemas de privacidad o seguridad. También podría dar como resultado una producción inconsistente.
Imagine almacenar en caché una página que tiene un carrito de compras. Almacenar en caché toda la página daría como resultado que todos tuvieran el mismo valor del carrito de compras.
Este es el comportamiento VCL integrado de Varnish para cookies:
- Cuando Varnish ve un
Cookie
encabezado en la solicitud, no entregará el objeto desde la caché porque asume que el contenido está personalizado.
- Cuando Varnish ve un
Set-Cookie
encabezado en la respuesta, no almacenará el objeto en la caché porque establecer una cookie es un cambio de estado que también implica personalización.
Despojando galletas
Una vez que se establece una cookie a través del Set-Cookie
encabezado de respuesta, se pasará como Cookie
encabezado de solicitud para cada solicitud posterior, incluso para páginas que realmente no necesitan estas cookies.
Por eso es importante determinar qué páginas requieren cookies y cuáles no. Es igualmente importante identificar las cookies de seguimiento, porque son procesadas por el cliente en Javascript y no en el servidor.
Aquí hay un ejemplo de VCL en el que eliminamos todas las cookies, excepto las que necesitamos en el 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;
}
}
En este caso sólo
PHPSESSID
se conserva la cookie, ya que es necesaria para realizar un seguimiento de los inicios de sesión. Si después de la lógica de reemplazo esta cookie sigue ahí, Varnish no entregará la respuesta del caché. Si esta cookie no se configuró, pero había un montón de cookies de seguimiento, todas las cookies se eliminan y la página se puede mostrar desde la memoria caché.
Eliminar cookies para determinadas páginas
Si bien el ejemplo anterior incluía eliminar cookies seleccionadas y conservar solo la PHPSESSID
cookie, aún podría terminar en páginas que en realidad no necesitan esa cookie de sesión.
Aquí hay un ejemplo de VCL en el que las cookies se eliminan por completo, excepto en las páginas que realmente necesitan una cookie específica, como las páginas de administración y la página del carrito de compras:
vcl 4.1;
sub vcl_recv {
if(req.url ~ "^/admin" || req.url == "/cart") {
return(pass);
}
unset req.http.Cookie;
}
Eliminación de encabezados Set-Cookie
Como se muestra enhttps://www.varnish-software.com/developers/tutorials/varnish-builtin-vcl/#dont-cache-responses-with-set-cookie-headers, la VCL incorporada no almacenará un objeto en la caché si Set-Cookie
se utiliza un encabezado, porque implica un cambio de estado.
Sin embargo, esto no significa que la página nunca terminará en el caché: la siguiente respuesta del servidor probablemente no contendrá el Set-Cookie
encabezado porque la cookie ya está configurada. En ese caso, la siguiente respuesta sin el Set-Cookie
encabezado puede terminar en el caché.
Sin embargo, si está seguro de que no necesita configurar una cookie para determinadas páginas, también puede decidir quitar el Set-Cookie
encabezado.
El siguiente ejemplo evita que un backend establezca una cookie para contenido 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;
}
}
Volver a adjuntar cookies
Si bien es posible almacenar el valor de la cookie en un encabezado, luego eliminar las cookies en VCL para servirlas desde el caché y finalmente volver a adjuntarlas para las solicitudes de backend, en realidad no tiene mucho sentido.
¿Por qué enviarías cookies para una solicitud de backend si la respuesta almacenable en caché no necesita una cookie para crear su resultado?
Si una solicitud de backend necesita el valor de la cookie para componer la salida, probablemente significa que la respuesta no se podrá almacenar en caché, por lo que también podría omitir el caché por completo para esa solicitud.
Próximos pasos
Como tu pregunta no era muy específica, también tuve que darte una respuesta muy general.
Si mi respuesta responde completamente a tu pregunta, te invito a especificar más detalles sobre tu caso de uso y a cambio te daré una respuesta más detallada.