You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 19:57:02