5

我看到人们谈论如何根据各种信息重写 URI。但我想规范化正在请求的域名。这是我尝试过的:

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;

    if (request.method.toUpperCase() != 'GET') {
        callback(null, request);
        return;
    }

    request.origin = {
        custom: {
            domainName: 'slashdot.org',
            port: 443,
            protocol: 'https',
            path: request.uri
        }
    };
    request.headers.host = {
        "key": "Host",
        "value": request.origin.custom.domainName
    };

    console.log("returning req:", request);

    callback(null, request);
}

我希望这会拉起请求,然后云端会针对我的规范化域提出请求。(对于示例和测试,我使用的是 slashdot,因为很明显这不是我的内容)。

最终,我试图在不进行重定向的情况下规范化请求,而是在命中命中源之前重写请求。

4

1 回答 1

6

哦,整洁。我终于想出了如何做到这一点。首先,一些限制:

  • 使用 https,这仅适用于您证书下的域。所以我不能使用mydomain.comandslashdot.org除非我是CmdrTaco。没关系,我的 AWS ACM证书包括三个域,其中一个是我的实际域。我会在actualdomain.com下面这样称呼它。
  • 这不能在查看器请求上完成,只能在源请求上完成,因为host对于查看器请求是只读的

鉴于此,我使用“示例:使用源请求触发器从 Amazon S3 源更改为自定义源”进行了一些小的修改。这是完整的 Lambda 代码。

'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const destDomain = 'actualdomain.com';


    /* Set custom origin fields*/
    request.origin = {
        custom: {
            domainName: destDomain,
            port: 443,
            protocol: 'https',
            path: '',
            sslProtocols: ['TLSv1', 'TLSv1.1', 'TLSv1.2'],
            readTimeout: 5,
            keepaliveTimeout: 5,
            customHeaders: {}
        }
    };
    request.headers['host'] = [{ key: 'host', value: destDomain}];

    callback(null, request);
};

因此,类似于文档中给出的示例,destDomain是实际域,并且我的证书中的任何合法域都被代理到该 dest,而最终用户实际上没有看到actualdomain.com.

于 2018-07-23T02:12:45.073 回答