通过 AWS Lambda 和 CloudFront 重定向 URL

Posted

技术标签:

【中文标题】通过 AWS Lambda 和 CloudFront 重定向 URL【英文标题】:Redirect URL through AWS Lambda and CloudFront 【发布时间】:2021-06-24 16:31:54 【问题描述】:

我有一个 lambda 函数,我希望执行从 https://foo.test.com/user_id/bar/https://app.test.com/user_id/new 的 301 重定向

用户的请求有一个设置为变量 ($userId) 并传递给目标 URI ($newUri) 的 user_id。

user_id的值是数字和字母(12-qw12

我编写了以下代码,将 ID 设置为变量并将其传递给响应标头:

exports.handler = function handler(event, context, callback) 
    let request = event.Records[0].cf.request;
    let uri = request.uri;
    let userId = uri.split('/')[3];
    let newUri = `https://app.test.com/` + userId + `/new`;
    const response = 
        headers: 
            'location': [
                key: 'Location',
                value: newUri,
            ],
        ,
        status: '301',
        statusDescription: 'Moved Permanently',
    ;
    callback(null,response);
;

不幸的是,我从传递给响应标头的$userId 中得到一个空值:

https://app.test.com//new

如果我将响应标头中的值作为字符串 (value: 'https://app.test.com/12-qw12/new') 写入,则它可以正常工作。

如何将变量 ($userId) 传递到响应标头而不得到空值?

【问题讨论】:

【参考方案1】:

您可以查看请求事件结构 here:

您可以通过使用 console.log 并检查 Cloudwatch 中的相应日志来查看请求 URI 字段的实际值。 要打印请求 uri,请在代码的最后两行之前添加以下行:

console.log(Request uri is "$request.uri");

那么你就可以知道你在哪个索引中读取了userid值。

【讨论】:

我做了这个测试,看到我从哪个索引读取了 user_id。另外,我已经打印了 user_id 并输出了正确的 userid。这里的问题是该变量在响应标头中为空。 您能输入 request.uri 在 cloudwatch 上显示的值吗

以上是关于通过 AWS Lambda 和 CloudFront 重定向 URL的主要内容,如果未能解决你的问题,请参考以下文章

使用 AWS Pinpoint 通过 Lambda 函数发送通知

通过带有响应的 AWS Lambda 上传和处理文件

通过 AWS Lambda 和 Cognito 注册用户(无服务器架构)

通过 AWS Lambda 和 CloudFront 重定向 URL

使用代理通过 AWS API Gateway 的 Lambda 错误

javascript CloudWatch到AWS Lambda到Slack Channel Alerts和Charts。通过SNS主题通过Lambda函数将CloudWatch警报发布到Slack通