diff --git a/vendor/magento/module-page-cache/etc/varnish4.vcl b/vendor/magento/module-page-cache/etc/varnish4.vcl index 1e51b6e1107..7e21be84976 100644 --- a/vendor/magento/module-page-cache/etc/varnish4.vcl +++ b/vendor/magento/module-page-cache/etc/varnish4.vcl @@ -170,6 +170,18 @@ sub vcl_backend_response { # validate if we need to cache it and prevent from setting cookie if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) { + # Collapse beresp.http.set-cookie in order to merge multiple set-cookie headers + # Although it is not recommended to collapse set-cookie header, + # it is safe to do it here as the set-cookie header is removed below + std.collect(beresp.http.set-cookie); + # Do not cache the response under current cache key (hash), + # if the response has X-Magento-Vary but the request does not. + if ((bereq.url !~ "/graphql" || !bereq.http.X-Magento-Cache-Id) + && bereq.http.cookie !~ "X-Magento-Vary=" + && beresp.http.set-cookie ~ "X-Magento-Vary=") { + set beresp.ttl = 0s; + set beresp.uncacheable = true; + } unset beresp.http.set-cookie; } diff --git a/vendor/magento/module-page-cache/etc/varnish5.vcl b/vendor/magento/module-page-cache/etc/varnish5.vcl index 7adededf330..0c385c3ed38 100644 --- a/vendor/magento/module-page-cache/etc/varnish5.vcl +++ b/vendor/magento/module-page-cache/etc/varnish5.vcl @@ -171,6 +171,18 @@ sub vcl_backend_response { # validate if we need to cache it and prevent from setting cookie if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) { + # Collapse beresp.http.set-cookie in order to merge multiple set-cookie headers + # Although it is not recommended to collapse set-cookie header, + # it is safe to do it here as the set-cookie header is removed below + std.collect(beresp.http.set-cookie); + # Do not cache the response under current cache key (hash), + # if the response has X-Magento-Vary but the request does not. + if ((bereq.url !~ "/graphql" || !bereq.http.X-Magento-Cache-Id) + && bereq.http.cookie !~ "X-Magento-Vary=" + && beresp.http.set-cookie ~ "X-Magento-Vary=") { + set beresp.ttl = 0s; + set beresp.uncacheable = true; + } unset beresp.http.set-cookie; } diff --git a/vendor/magento/module-page-cache/etc/varnish6.vcl b/vendor/magento/module-page-cache/etc/varnish6.vcl index cc381baaf31..5b747db8a46 100644 --- a/vendor/magento/module-page-cache/etc/varnish6.vcl +++ b/vendor/magento/module-page-cache/etc/varnish6.vcl @@ -175,6 +175,18 @@ sub vcl_backend_response { # validate if we need to cache it and prevent from setting cookie if (beresp.ttl > 0s && (bereq.method == "GET" || bereq.method == "HEAD")) { + # Collapse beresp.http.set-cookie in order to merge multiple set-cookie headers + # Although it is not recommended to collapse set-cookie header, + # it is safe to do it here as the set-cookie header is removed below + std.collect(beresp.http.set-cookie); + # Do not cache the response under current cache key (hash), + # if the response has X-Magento-Vary but the request does not. + if ((bereq.url !~ "/graphql" || !bereq.http.X-Magento-Cache-Id) + && bereq.http.cookie !~ "X-Magento-Vary=" + && beresp.http.set-cookie ~ "X-Magento-Vary=") { + set beresp.ttl = 0s; + set beresp.uncacheable = true; + } unset beresp.http.set-cookie; }