繁体   English   中英

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

[英]How to enable gzip compression on API Gateway?

我在 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 响应并添加一些必要的标头以使其工作。

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

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

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

如何在 AWS 控制台中启用压缩

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM