微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 API Gateway 上启用 gzip 压缩?

如何解决如何在 API Gateway 上启用 gzip 压缩?

我在 API Gateway 上启用 gzip 压缩时遇到了一些麻烦。我使用的是 Laravel Vapor,它在底层使用了 AWS Lambda。

我已经在 API Gateway 控制台仪表板中搜索设置,但无济于事。我在我的应用程序中设置了 CORS,并启用了以下功能

'allowedHeaders' => [
        'Accept','Accept-Encoding','Authorization','Access-Control-Expose-Headers','Content-Type','X-Requested-With','Origin','X-Shadow-Progress','X-Socket-ID','x-socket-id'
    ],

我的印象是在我的后端设置 Accept-Encoding 可以解决问题,但它根本不起作用。响应标头中从不包含 content-encoding: gzip

解决方法

我在 Vapor 上运行了许多项目。我忘记了我们是否必须在 API 网关内部做任何特殊的事情来实现这一点,但我创建了一个中间件,它可以对响应进行 gzip 压缩,这对我们有用:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class GzipEncodeResponse
{
    public function handle(Request $request,Closure $next)
    {
        $response = $next($request);

        if (in_array('gzip',$request->getEncodings()) && function_exists('gzencode')) {
            $response->setContent(gzencode($response->getContent(),9));
            $response->headers->add([
                'Content-Encoding' => 'gzip','X-Vapor-Base64-Encode' => 'True',]);
        }
        return $response;
    }
}

这会检查请求是否接受 gzip 编码,如果是,则对响应进行 gzip 压缩并添加一些必要的标头以使其正常工作。

更新;自从写了这个答案,我意识到谷歌上没有太多内容解释如何做到这一点。我已经详细介绍了这种方法,并详细介绍了 blog post on my website 中发生的事情。

,

AWS API Gateway 确实支持压缩(gzipdeflate)。只是有点难找。您可以通过 AWS 控制台或 AWS CLI 中的网关设置启用它。

在 AWS 控制台中选择您的 API 网关,然后您可以在 设置 > 内容编码(见下图)下找到它。

how to enable compression in AWS console

文档:https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-enable-compression.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。