From 907cd5f5f5f39e168f1a64845a1e337798b30cb2 Mon Sep 17 00:00:00 2001 From: Tim Kelty Date: Thu, 19 Dec 2024 10:24:20 -0500 Subject: [PATCH 1/2] Use CDN-Cache-Control --- src/HeaderEnum.php | 2 ++ src/StaticCache.php | 21 ++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/HeaderEnum.php b/src/HeaderEnum.php index e67e18a..6aef573 100644 --- a/src/HeaderEnum.php +++ b/src/HeaderEnum.php @@ -8,6 +8,8 @@ enum HeaderEnum: string case CACHE_PURGE_TAG = 'Cache-Purge-Tag'; case CACHE_PURGE_PREFIX = 'Cache-Purge-Prefix'; case CACHE_CONTROL = 'Cache-Control'; + case CDN_CACHE_CONTROL = 'CDN-Cache-Control'; + case SURROGATE_CONTROL = 'Surrogate-Control'; case AUTHORIZATION = 'Authorization'; case DEV_MODE = 'Dev-Mode'; case REQUEST_TYPE = 'Request-Type'; diff --git a/src/StaticCache.php b/src/StaticCache.php index 5bff051..63db603 100644 --- a/src/StaticCache.php +++ b/src/StaticCache.php @@ -219,12 +219,27 @@ private function addCacheHeadersToWebResponse(): void 'duration' => $this->cacheDuration, ])); - // Cache in proxy, not in browser + // Copy the cache-control header to the cdn-cache-control header + $cacheControl = Craft::$app->getResponse()->getHeaders()->get( + HeaderEnum::CACHE_CONTROL->value + ); + + // Enable ESI processing + // Note: The Surrogate-Control header will cause Cloudflare to ignore + // the Cache-Control header: https://developers.cloudflare.com/cache/concepts/cdn-cache-control/#header-precedence Craft::$app->getResponse()->getHeaders()->setDefault( - HeaderEnum::CACHE_CONTROL->value, - "public, s-maxage=$this->cacheDuration, max-age=0", + HeaderEnum::SURROGATE_CONTROL->value, + 'content="ESI/1.0"', ); + // Cache in CDN, not in browser + Craft::$app->getResponse()->getHeaders()->setDefault( + HeaderEnum::CDN_CACHE_CONTROL->value, + $cacheControl, + ); + + + // Capture, remove any existing headers so we can prepare them $existingTagsFromHeader = Collection::make($headers->get(HeaderEnum::CACHE_TAG->value, first: false) ?? []); $headers->remove(HeaderEnum::CACHE_TAG->value); From 6b1b8627648c7e976c473807e668177f184b42ec Mon Sep 17 00:00:00 2001 From: Tim Kelty Date: Thu, 19 Dec 2024 14:23:06 -0500 Subject: [PATCH 2/2] Wrap conditional --- src/StaticCache.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/StaticCache.php b/src/StaticCache.php index 63db603..ddcde8f 100644 --- a/src/StaticCache.php +++ b/src/StaticCache.php @@ -224,6 +224,14 @@ private function addCacheHeadersToWebResponse(): void HeaderEnum::CACHE_CONTROL->value ); + // Cache in CDN, not in browser + if ($cacheControl) { + Craft::$app->getResponse()->getHeaders()->setDefault( + HeaderEnum::CDN_CACHE_CONTROL->value, + $cacheControl, + ); + } + // Enable ESI processing // Note: The Surrogate-Control header will cause Cloudflare to ignore // the Cache-Control header: https://developers.cloudflare.com/cache/concepts/cdn-cache-control/#header-precedence @@ -232,14 +240,6 @@ private function addCacheHeadersToWebResponse(): void 'content="ESI/1.0"', ); - // Cache in CDN, not in browser - Craft::$app->getResponse()->getHeaders()->setDefault( - HeaderEnum::CDN_CACHE_CONTROL->value, - $cacheControl, - ); - - - // Capture, remove any existing headers so we can prepare them $existingTagsFromHeader = Collection::make($headers->get(HeaderEnum::CACHE_TAG->value, first: false) ?? []); $headers->remove(HeaderEnum::CACHE_TAG->value);