CloudFront Lambda @ Edge HTTPS редирект - PullRequest
0 голосов
/ 25 октября 2018

У меня есть дистрибутив CloudFront с функцией Lambda, прикрепленной к хуку запросов зрителя.Я использую это для перенаправления в канонический домен (например, www.foo.tld -> foo.tld).У меня также есть сам дистрибутив, настроенный для перенаправления HTTP -> HTTPS.

Проблема в том, что для этого клиенту необходимо выполнить 2 запроса, чтобы получить правильный URL.Например:

http://www.foo.tld/ -> https://www.foo.tld/ (performed by CloudFront)
https://www.foo.tld/ -> https://foo.tld/ (performed by Lambda function attached to viewer request hook)

Я бы хотел, чтобы это было сделано за 1 запрос:

http://www.foo.tld/ -> https://foo.tld/

Похоже, мне нужно добавить эту функцию в событие запроса, но документация , кажется, указывает на то, что протокол не доступен для функции Lambda в событии запроса.

У меня такой вопрос:

  • Как мне открыть протокол для Lambda?функция, прикрепленная к хуку Viewer Request?
  • Альтернативно, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 26 октября 2018

Примечание: перенаправляет, которые изменяют и имя хоста и , схема может быть проблематичной, больше в будущем, чем сейчас, так как браузеры становятся менее приемлемыми для поведения HTTP без TLS.В данный момент я не могу найти источник, подтверждающий это, но у меня сложилось впечатление, что следует избегать перенаправления напрямую с http://www.example.com на https://example.com.Тем не менее, если это то, что вы хотите ...


CloudFront и Lambda @ Edge поддерживают это, но только в триггере запроса на отправку.

Если вы включаете белый список заголовка CloudFront-Forwarded-Proto вв настройках поведения кэша вы можете получить доступ к этому значению следующим образом:

const request = event.Records[0].cf.request; // you may already have this
const scheme = request.headers['cloudfront-forwarded-proto'][0].value;

Значение scheme будет http или https.

Я являюсьнемного педантичный, поэтому мне нравится отказоустойчивость.Эта альтернативная версия всегда будет устанавливать scheme в https и избегать исключения, которое будет выброшено, если по какой-либо причине заголовок отсутствует.Это может или не может соответствовать вашему вкусу:

const request = event.Records[0].cf.request; // you may already have this
const scheme = (request.headers['cloudfront-forwarded-proto'] || [{ value: 'https' }])[0].value;

Причина, по которой это может быть сделано только в триггере исходного запроса, заключается в том, что CloudFront фактически не добавляет этот заголовок внутри, пока не будет запущен триггер Viewer Request., если он есть.

Но учтите также, что вы почти наверняка захотите сделать это в триггере исходного запроса - потому что ответы от этих триггеров могут быть кэшированы ... что должно означатьболее быстрое реагирование и снижение затрат.Белый список заголовков также добавляет его к ключу кэширования. Это означает, что CloudFront будет автоматически кэшировать отдельные ответы HTTP и HTTPS для любой страницы и воспроизводить их только для идентичных запросов.

См. Также https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-requirements-limits.html#lambda-cloudfront-star-headers

...