AWS CloudFront перезапись путей в ответах на перенаправления от источника

Вопрос или проблема

Я использую AWS Cloudfront в качестве “обратного прокси”, с исходным сервером, который имеет непустой “путь источника”, поэтому пути на исходном сервере отличаются от путей, которые видит клиент.

Таким образом, мой клиент может запросить /foo у Cloudfront, а затем он запрашивает /x/foo у моего исходного сервера и передаёт ответ.

Если исходный сервер возвращает перенаправление, скажем, на /x/foo2, то Cloudfront вернёт это перенаправление без изменений клиенту. Это не работает, потому что, когда клиент следует за этим перенаправлением, он неправильно включает /x путь источника. Чтобы это работало, мне нужно, чтобы клиент видел перенаправление на /foo2, а не на /x/foo2.

Как я могу заставить Cloudfront переписывать это перенаправление, чтобы удалить путь источника из ответов на перенаправления при их передаче?

В Apache httpd, когда он действует как обратный прокси, есть функция под названием ProxyPassReverse, чтобы достичь этого, см. Какова цель директивы ProxyPassReverse. Я не могу найти эквивалентную функцию для Cloudfront.

Соответствующая документация Cloudfront:

Ответ или решение

Вопрос, который вы подняли, касается работы AWS CloudFront в качестве обратного прокси и управления редиректами, которые возвращает сервер происхождения (origin server). Давайте подробно рассмотрим, как вы можете настроить поведение CloudFront для изменения путей в ответах перенаправления.

Проблема

Вы правильно отметили, что AWS CloudFront, действуя как обратный прокси, передаёт ответы от сервера происхождения клиенту без изменения — в том числе и редиректы. В вашем случае, когда клиент запрашивает /foo, CloudFront обращается к /x/foo на вашем сервере происхождения. Однако, если сервер возвращает редирект, скажем, на /x/foo2, клиент получает этот ответ как есть, что приводит к неправильному поведению из-за включения пути origin /x.

Решение

К сожалению, в AWS CloudFront отсутствует встроенная функция, аналогичная директиве ProxyPassReverse, которая доступна в Apache. Однако, есть несколько подходов, которые могут помочь вам достичь желаемого результата.

1. Использование функций AWS Lambda@Edge

Одним из наиболее эффективных способов управления редиректами в CloudFront является использование Lambda@Edge. Это позволяет запускать код на уровне edge, т.е. при обработке запросов и ответов.

Пример функции Lambda@Edge

Вы можете написать функцию, которая будет реагировать на события origin response. В ней вам нужно будет анализировать статус ответа и, при необходимости, изменять Location заголовок.

'use strict';
exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    // Проверка на 3xx статус
    if (response.status.startsWith('3')) {
        const locationHeader = response.headers['location'];

        if (locationHeader) {
            // Изменяем заголовок location
            const originalLocation = locationHeader[0].value;
            const newLocation = originalLocation.replace('/x/', '/'); // Убираем '/x/'
            response.headers['location'][0].value = newLocation;
        }
    }

    callback(null, response);
};

2. Настройки поведения в CloudFront

Чтобы ваш Lambda выполнялся при обработке ответов, вам необходимо привязать его к вашему дистрибутиву CloudFront. Это можно сделать в разделе "Функции" в консоли CloudFront, выбрав нужное событие, например, origin response.

Важные замечания

  • Проверка: Тестируйте вашу функцию, чтобы убедиться, что она работает корректно, и редиректы изменяются как ожидается.
  • Производительность: Использование Lambda@Edge может добавить небольшой латентный эффект, но он обычно минимален из-за распределенной архитектуры AWS.
  • Отладка: В случае ошибок, убедитесь, что вы используете правильные логи, чтобы отслеживать проблемы с функцией.

Заключение

Хоть AWS CloudFront не предоставляет прямой аналог ProxyPassReverse, вы можете обойти это ограничение с помощью Lambda@Edge для перес rewriting redirect responses. Этот подход является гибким и мощным, позволяя тем самым настраивать поведение CloudFront так, чтобы оно соответствовало вашим требованиям. Если у вас есть дополнительные вопросы или потребуется помощь с конкретной реализацией, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...