Lambda@edge redirect попадает в цикл перенаправления

У меня есть статический сайт на AWS S3. Есть настройка маршрута 53 и облачного фронта, и все работает гладко. s3 Bucket настроен для использования index.html в качестве индексного документа.

Теперь я добавил еще один файл с именем index-en.html, который должен обслуживаться, когда страной запроса является любая другая страна, а не моя страна.

Для этого я добавил функцию lambda@edge со следующим кодом:

'use strict';

/* This is an origin request function */
exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    /*
     * Based on the value of the CloudFront-Viewer-Country header, generate an
     * HTTP status code 302 (Redirect) response, and return a country-specific
     * URL in the Location header.
     * NOTE: 1. You must configure your distribution to cache based on the
     *          CloudFront-Viewer-Country header. For more information, see
     *          http://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
     *       2. CloudFront adds the CloudFront-Viewer-Country header after the viewer
     *          request event. To use this example, you must create a trigger for the
     *          origin request event.
     */

    let url = 'prochoice.com.tr';
    if (headers['cloudfront-viewer-country']) {
        const countryCode = headers['cloudfront-viewer-country'][0].value;
        if (countryCode === 'TR') {
            url = 'prochoice.com.tr';
        } else {
            url = 'prochoice.com.tr/index-en.html';
        }
    }

    const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: url,
            }],
        },
    };
    callback(null, response);
};

Я также отредактировал поведение фронта облака, добавив в белый список заголовки стран происхождения и страны просмотра и установив событие просмотра запроса облачного фронта и отношение лямбда-функции ARN.

Однако я получаю "слишком много ошибок перенаправления".

У меня есть 2 вопроса:

  1. Как исправить ошибку "слишком много перенаправлений"?
  2. Для зрителей за пределами "TR" целевой страницей по умолчанию должен быть index-en.html, из которого через меню навигации доступны еще 2 страницы на английском языке. Таким образом, когда пользователи запрашивают определенную страницу из навигации по страницам, они должны иметь доступ к этим страницам, когда ни одна страница не запрашивается, должна быть предоставлена ​​целевая страница по умолчанию.

Ценю помощь. Благодарю.

1 ответ

Вы создаете цикл перенаправления, потому что отправляете зрителя обратно на тот же сайт, на ту же страницу, независимо от результатов вашего теста.

if (countryCode === 'TR') {
    return callback(null, request);
} else {
...

callback(null,request) говорит CloudFront продолжить обработку запроса, а не генерировать ответ. С помощью return до обратного вызова заставляет остальную часть кода триггера не запускаться.

Другие вопросы по тегам