From 4e8c7e93954a67d874df87d2a4921f45b55efe50 Mon Sep 17 00:00:00 2001 From: Shift Date: Thu, 15 Jan 2026 13:17:57 +0000 Subject: [PATCH] Custom `cache-control` middleware --- app/Http/Middleware/ForceCache.php | 53 +++++++++++++++++++ app/Http/Middleware/SetCacheControlHeader.php | 40 ++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 app/Http/Middleware/ForceCache.php create mode 100644 app/Http/Middleware/SetCacheControlHeader.php diff --git a/app/Http/Middleware/ForceCache.php b/app/Http/Middleware/ForceCache.php new file mode 100644 index 000000000..cd1d3ee8a --- /dev/null +++ b/app/Http/Middleware/ForceCache.php @@ -0,0 +1,53 @@ +shouldCacheResponse($request, $response)) { + $response->headers->add([ + 'Cache-Control' => 'max-age=86400, public', + 'ETag' => $this->generateEtag($request), + ]); + $response->headers->remove('Set-Cookie'); + } + + return $response; + } + + public function shouldCacheResponse(Request $request, Response $response): bool + { + if (! $request->isMethod('GET')) { + return false; + } + + if (! $response->isSuccessful()) { + return false; + } + + if ($request->user()) { + return false; + } + + return true; + } + + private function generateEtag(Request $request): string + { + $uri = $request->path(); + + if ($request->getQueryString()) { + $uri .= '?' . $request->getQueryString(); + } + + return md5($uri . ':' . time()); + } +} diff --git a/app/Http/Middleware/SetCacheControlHeader.php b/app/Http/Middleware/SetCacheControlHeader.php new file mode 100644 index 000000000..a3a1c687c --- /dev/null +++ b/app/Http/Middleware/SetCacheControlHeader.php @@ -0,0 +1,40 @@ +shouldCacheResponse($request, $response)) { + $response->headers->add([ + 'Cache-Control' => 'max-age=86400, public', + ]); + } + + return $response; + } + + public function shouldCacheResponse(Request $request, Response $response): bool + { + if (! $request->isMethod('GET')) { + return false; + } + + if (! $response->isSuccessful()) { + return false; + } + + if (app()->isLocal()) { + return false; + } + + return true; + } +}