如何在Laravel中创建最终响应中间件,避免无必要Set-Cookie适配Varnish缓存?
一、创建中间件类
首先生成中间件文件:
php artisan make:middleware TrimUnnecessaryCookies
打开app/Http/Middleware/TrimUnnecessaryCookies.php,替换为以下代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class TrimUnnecessaryCookies { // 定义需要移除的Cookie键列表 private array $unwantedCookies = [ '_token', '_csrf', '_previous', '_redirect', '_flash', 'PHPDEBUGBAR_STACK_DATA', ]; public function handle(Request $request, Closure $next) { $response = $next($request); // 仅对未认证用户执行清理操作 if (!Auth::check()) { foreach ($this->unwantedCookies as $cookieName) { // 移除匹配指定Cookie名的Set-Cookie头 $response->headers->remove('Set-Cookie', function ($value) use ($cookieName) { return str_starts_with($value, "{$cookieName}="); }); } // 如果所有Set-Cookie头都被移除,彻底删除该头字段 if (empty($response->headers->get('Set-Cookie'))) { $response->headers->remove('Set-Cookie'); } } return $response; } }
二、注册为最终响应中间件
为确保中间件在所有可能添加Cookie的逻辑之后执行,将其注册到全局中间件的末尾:
打开app/Http/Kernel.php,在$middleware数组最后添加:
protected $middleware = [ // ... 其他已有的全局中间件 \App\Http\Middleware\TrimUnnecessaryCookies::class, ];
如果仅需要针对静态页面所在的路由组生效,也可以将其添加到对应路由组的中间件列表末尾(比如web组)。
三、验证效果
通过curl请求未认证用户访问的静态页面,检查响应头:
curl -I http://your-app-domain.com/your-static-page
如果响应中不再包含Set-Cookie头(或仅保留必要的非用户端生成Cookie),说明中间件生效。此时Varnish可以正常缓存这些无状态请求的响应。
关键说明
- 该中间件仅对未认证用户生效,避免影响已登录用户的正常会话功能。
- 针对
barryvdh/laravel-debugbar注入的PHPDEBUGBAR_STACK_DATACookie,即使Debugbar处于启用状态,也会被移除(建议在生产环境关闭Debugbar以减少额外开销)。 - 作为最终中间件,必须保证它在
StartSession、AddQueuedCookiesToResponse等会添加Cookie的中间件之后执行,否则清理逻辑会被后续中间件覆盖。
内容的提问来源于stack exchange,提问作者Maurizio
相关产品推荐
相关产品推荐

