laravel - 如何在 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 网关内部做任何特别的事情来实现这一点,但我创建了一个中间件,它可以压缩响应,这对我们有用:
<?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 压缩并添加一些必要的标头以使其正常工作。
更新; 自从写了这个答案,我意识到谷歌上没有太多的内容来解释如何做到这一点。我已经详细介绍了这种方法,并在我的网站上的一篇博文中详细介绍了正在发生的事情。
推荐阅读
- python - 使用Repr更改单位
- json - Reg没有从AgGrid中的json加载数据
- c# - 如何将 C# 中的类型从字符串转换为 JObject
- typescript - TS2345:“构造”类型不是从“构造”派生的类
- python - 当 conda 尚不支持时,如何在 Windows 上安装最新的 Tensorflow(此处:2.2)?
- c# - 使用编号自定义 Microsoft Word 内置样式
- python - 是否可以为 Box 对象的索引分配值?
- python - 在ubuntu中一次调用多次调用cython转换的应用程序
- powershell - 2goarray 适用于 cmd 但不适用于 powershell
- avro - Rsyslog avro 日志解码失败