基于设备的重定向在来自S3源的CloudFront服务上

时间:2017-09-21 02:59:54

标签: amazon-web-services amazon-s3 url-redirection amazon-cloudfront

有没有办法使用CloudFront将用户重定向到基于m.foobar.com标题的网络应用的移动版本User Agent

我确实使用CloudFront-Is-Mobile-Viewer标头使用用户的设备类型阅读了标头缓存。但是,如果我使用自定义来源为我的资产(ELB或EC2实例)提供服务,我只能将其列入白名单。在这种情况下,我可以编辑我的服务器配置来处理重定向。

但是,我现在使用S3来为我的应用程序提供服务,并希望在CloudFront / S3生态系统中使用解决方案。

编辑: 对于S3发行版,我不能访问CloudFront-Is-Mobile-Viewer和其他CF头。 This is all that's available

任何帮助,指针将不胜感激!

背景材料:http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html https://aws.amazon.com/blogs/aws/enhanced-cloudfront-customization/

4 个答案:

答案 0 :(得分:2)

以下是我如何解决它。

Lambda @ Edge功能

'use strict';

exports.handler = (event, context, callback) => {
    /*
     * If mobile, redirect to mobile domain
    */
    const isMobileHeader = 'CloudFront-Is-Mobile-Viewer'

    const request = event.Records[0].cf.request;
    const headers = request.headers;

    let response = event.Records[0].cf.response;
    if (headers[isMobileHeader.toLowerCase()] && headers[isMobileHeader.toLowerCase()] == "true") {
        response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: 'http://m.foobar.com',
            }],
        },
    };

    callback(null, response);
};

CloudFront分配

Behaviours:
  Default:
    Cache Based on Selected Request Headers: Whitelist
    Whitelist Headers:
      - CloudFront-Is-Mobile-Viewer
    Lambda Function Associations:
      Event Type: Viewer Response
      Lambda Function ARN:  [ARN of function from Lambda@Edge Function]

进一步阅读

修改1

原来是S3 Origins,正如Sanjay指出的那样limited to a select set of headers for caching

我对此的建议是使用S3 Static Website hosting从S3 Origin更改为Custom Origin,然后我们可以将其定位为自定义原点。

S3 Bucket配置

S3 Bucket:
  Properties:
    Static Website Hosting: Use this bucket to host a website

请注意您在此页面上给出的端点名称,下一步将需要它。

CloudFront更新

Origins:
  Create Origin:
    Origin Domain Name: [Endpoint from above]
    Origin ID: Custom-S3StaticHosting
Behaviours:
  Default:
    Origin: Custom-S3StaticHosting

答案 1 :(得分:0)

以下是我将如何解决它。

您不需要为移动应用执行重定向。 (尽可能避免重定向)您可以使用相同的网址来提供桌面或移动内容。

在您的云端白名单中,只需将CloudFront-Is-Mobile-Viewer标题列入白名单。这将根据您的设备缓存内容。

实施查看器请求Lambda Edge并将其添加到CloudFront。 Lambda Edge用于在请求到达服务器之前对pop或CloudFront进行编程。

在LambdaEdge中,验证User-Agent标头并分类是否要提供移动或桌面内容。如果是移动设备,则您可以更改源移动内容的原始网址,否则您可以将其更改为桌面内容或默认内容。

您可以在用户请求LambdaEdge中获取您的http标头。

Lambda Edge文档:

http://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html

参考页面上提供了示例节点实现。

如果您真的想要执行重定向,可以使用查看器响应执行此操作,并根据收到的设备标头做出决策。

此博客

中介绍了查看器响应的示例实现

https://aws.amazon.com/blogs/aws/lambdaedge-intelligent-processing-of-http-requests-at-the-edge/

上面的实现只是吐出它收到的所有标头,而不是发送200 OK,代码需要通过重定向位置修改为3xx状态。

希望它有所帮助。

答案 2 :(得分:0)

目前在查看者回复,我们无法访问CloudFront-Is-X-Viewer标题,即使将其设置为白名单,而且还会读取状态标题-只要。我通过触发原始请求

解决了这个问题
exports.handler = (event, context, callback) => {
const name = 'cloudfront-is-mobile-viewer';
const request = event.Records[0].cf.request;
const headers = request.headers;

if (headers[name] && headers[name][0].value == "true") {
    callback(null, {
        status:'302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: `http://m.example.com${request.uri}`,
            }]
        }
    })
}

callback(null, request);

};

答案 3 :(得分:0)

如何使用此代码为Node.js添加解码器,我使用了此代码,但它给了我一个字符串(如何将其解码为URi字符串) 对不起,我将其添加为答案是因为我的信誉不佳

exports.handler = (event, context, callback) => {
const name = 'cloudfront-is-mobile-viewer';
const request = event.Records[0].cf.request;
const headers = request.headers;

if (headers[name] && headers[name][0].value == "true") {
     callback(null, {
        status:'302',
        statusDescription: 'Found',
           headers: {
        location: [{
            key: 'Location',
            value: `http://m.example.com${request.uri}`,
        }]
    }
})

}

callback(null,request); };