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 вопроса:
- Как исправить ошибку "слишком много перенаправлений"?
- Для зрителей за пределами "TR" целевой страницей по умолчанию должен быть index-en.html, из которого через меню навигации доступны еще 2 страницы на английском языке. Таким образом, когда пользователи запрашивают определенную страницу из навигации по страницам, они должны иметь доступ к этим страницам, когда ни одна страница не запрашивается, должна быть предоставлена целевая страница по умолчанию.
Ценю помощь. Благодарю.
1 ответ
Вы создаете цикл перенаправления, потому что отправляете зрителя обратно на тот же сайт, на ту же страницу, независимо от результатов вашего теста.
if (countryCode === 'TR') {
return callback(null, request);
} else {
...
callback(null,request)
говорит CloudFront продолжить обработку запроса, а не генерировать ответ. С помощью return
до обратного вызова заставляет остальную часть кода триггера не запускаться.