如何在API Gateway中启用gzip压缩?(Laravel Vapor环境下)
API Gateway + Laravel Vapor 启用gzip压缩失效解决方案
核心原因说明
- AWS API Gateway 无原生gzip压缩配置项,不会自动对后端Lambda返回的响应做压缩处理,压缩逻辑需要完全在Laravel应用侧实现
- 你仅在CORS配置中允许了
Accept-Encoding请求头传入,没有配置Laravel主动对响应做gzip编码,因此响应不会返回Content-Encoding: gzip头
具体解决步骤
1. 创建gzip压缩全局中间件
执行命令生成中间件文件:php artisan make:middleware GzipCompressResponse
编辑app/Http/Middleware/GzipCompressResponse.php内容如下:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class GzipCompressResponse { public function handle(Request $request, Closure $next) { $response = $next($request); // 跳过不需要压缩的场景:重定向、无内容响应、已压缩、客户端不支持gzip if ( !$request->acceptsEncoding('gzip') || $response->isRedirection() || $response->headers->has('Content-Encoding') || in_array($response->getStatusCode(), [204, 304]) ) { return $response; } $originalContent = $response->getContent(); $compressedContent = gzencode($originalContent, 9); // 更新响应内容和头信息 $response->setContent($compressedContent); $response->headers->set('Content-Encoding', 'gzip'); $response->headers->set('Content-Length', strlen($compressedContent)); // 确保跨域场景下前端可读取Content-Encoding头 $exposeHeaders = $response->headers->get('Access-Control-Expose-Headers', ''); $response->headers->set('Access-Control-Expose-Headers', trim("$exposeHeaders, Content-Encoding", ', ')); return $response; } }
2. 注册全局中间件
打开app/Http/Kernel.php,将刚才创建的中间件加入全局中间件数组:
protected $middleware = [ // 其他已配置的全局中间件... \App\Http\Middleware\GzipCompressResponse::class, ];
3. 特殊场景说明
- Laravel Vapor 托管的静态资源(CSS/JS/图片等)默认已自动开启gzip压缩,无需额外配置
- Lambda同步调用最大响应大小为6MB,若压缩后响应仍超过该阈值,需改用S3预签名URL返回大体积内容
- 二进制类响应(如文件下载流)无需经过该中间件压缩,代码中已自动跳过相关场景
验证方案
部署代码后,发送携带Accept-Encoding: gzip头的请求到业务接口,检查返回头中是否存在Content-Encoding: gzip,同时对比压缩前后的响应体积确认生效即可。
内容的提问来源于stack exchange,提问作者Ali Gajani
相关产品推荐
相关产品推荐

