Назад | Перейти на главную страницу

AWS Route53 и Lambda: перенаправление голых HTTP-запросов на HTTPS WWW для бессерверного приложения

Проблема

У меня есть сайт, работающий на «бессерверной» функции AWS Lambda. Route53 направляет запросы к шлюзу API, который подключается к функции Lambda.

Проблема в том, что вы не можете настроить традиционные серверные перенаправления.

пример

В качестве примера я последовал этому вопрос ответ направить http://<my_domain>.com к https://www.<my_domain>.com, Я использую псевдоним записи A для сегмента S3, который настроен как перенаправление статического сайта на https://www.<my_domain>.com.

Вопрос

Как я могу получить https://<my_domain>.com перенаправить на https://www.<my_domain>.com в бессерверной среде, такой как Lambda?

Вам нужно будет выполнить перенаправление в вашей лямбда-функции.

Я уверен, что фактическое имя хоста, используемое в URL-адресе, передается в Lambda, возможно, как event.headers.Host. Итак, в вашей Lambda вам нужно будет сделать что-то вроде этого кода в стиле Python:

def lambda_handler(event, context):
    if not event['headers']['Host'].startswith('www'):
        return PermanentRedirect('www.'+event['headers']['Host']+event['path'])

Однако на вашем месте я бы указал имя хоста без www на другой шлюз API с одной лямбдой, предназначенной для выполнения перенаправления на www. Тогда в вашем фактическом рабочий lambdas, вам не нужно беспокоиться о переадресации.

Надеюсь, это поможет :)

Я думаю, что для этого есть настройка в облачной среде. Либо так, либо используйте лямбда @ edge - так что вы не создаете «настоящие» лямбды.

Другой вариант, который я лично использую, - это поставить Cloudflare перед вашим облачным дистрибутивом - конечно, это две CDN, но Cloudflare чертовски легко может выполнять эти перенаправления.

Другой вариант - создать два облачных дистрибутива, один для www и один для не-www, но оба в конечном итоге будут на одном шлюзе API. Не идеально, поскольку преимущества кеширования будут ограничены, но это сработает.