#laravel #amazon-web-services #aws-api-gateway #laravel-vapor
Вопрос:
У меня возникли некоторые проблемы с включением сжатия gzip на шлюзе API. Я использую Laravel Vapor, который использует AWS Lambda под капотом.
Я просмотрел панель управления консоли шлюза API в поисках настроек, но безрезультатно. У меня есть настройка 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
в них никогда не содержались.
Ответ №1:
Я запускаю несколько проектов на Vapor. Я забыл, нужно ли было делать что-то особенное внутри API-шлюза, чтобы это работало, но я создал часть промежуточного программного обеспечения, которое загружает ответы, что делает для нас трюк:
<?php
namespace AppHttpMiddleware;
use Closure;
use IlluminateHttpRequest;
class GzipEncodeResponse
{
public function handle(Request $request, Closure $next)
{
$response = $next($request);
if (in_array('gzip', $request->getEncodings()) amp;amp; function_exists('gzencode')) {
$response->setContent(gzencode($response->getContent(), 9));
$response->headers->add([
'Content-Encoding' => 'gzip',
'X-Vapor-Base64-Encode' => 'True',
]);
}
return $response;
}
}
Это проверяет, что запрос принимает кодировку gzip, и если это так, то gzip-кодирует ответ и добавляет некоторые необходимые заголовки, чтобы заставить это работать.
Обновление; С момента написания этого ответа я понял, что в Google не так много контента, объясняющего, как это сделать. Я подробно описал этот подход и немного больше о том, что происходит, в сообщении в блоге на моем сайте.
Комментарии:
1. Спасибо @James. Попробую ваше решение. У меня все еще складывается впечатление, что API-шлюз должен решать эти проблемы, так как чаще всего это происходит на уровне сервера.
Ответ №2:
Шлюз API AWS поддерживает сжатие ( gzip
и deflate
). Его просто немного трудно найти. Вы можете включить его либо через настройки шлюзов в консоли AWS, либо через интерфейс командной строки AWS.
В консоли AWS выберите свой шлюз API, а затем вы можете найти его в разделе Настройки > >Кодирование содержимого (см. Изображение ниже).
Документация: https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-enable-compression.html
Комментарии:
1. Я не вижу этого пользовательского интерфейса. Мой пользовательский интерфейс совершенно другой.
2. Вы уверены, что используете API-шлюз? В противном случае, может быть, ваш регион отличается? Можете ли вы проверить us-восток-1 или eu-запад-1? Они должны выглядеть так, когда вы выбираете шлюз API.