Lambda @ edge重定向进入重定向循环

时间:2018-11-19 13:04:08

标签: amazon-s3 amazon-cloudfront aws-lambda-edge

我在aws s3上有一个静态网站。拥有设置路线53和云端,一切都可以顺利进行。 s3存储桶已设置为将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);
};

我还编辑了云前端行为,以将Origin和Viewer-country标头列入白名单,并设置了Cloudfront Viewer-Request事件和lambda Function ARN关系。

但是我收到“重定向错误太多”。

我有2个问题:

  1. 如何纠正“重定向过多”错误?
  2. 对于“ TR”以外的观众,默认目标网页应为index-en.html,从中可以通过导航菜单访问另外2个英文页面。因此,当用户从页面导航中请求特定页面时,他们应该能够访问这些页面,而当不请求任何页面时,则应提供默认的目标页面。

提供帮助。 谢谢。

1 个答案:

答案 0 :(得分:0)

您创建重定向循环是因为,无论测试结果如何,您都将查看器发送回相同的站点,相同的页面。

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

callback(null,request)告诉CloudFront继续处理请求-不生成响应。在回调之前使用return会导致其余触发代码无法运行。