Переписать хост с облачным фронтом с помощью lambda@edge, как?

Я вижу, как люди говорят о том, как переписать 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);
}

Я надеялся, что это подтолкнет запрос, и этот cloudfront сделает запрос к моему канонизированному домену. (для примера и тестирования я использую slashdot, поскольку очевидно, что это не мой контент).

В конечном счете, я пытаюсь канонизировать запрос, не делая переадресацию, а вместо этого переписываю запрос до попадания в исходную точку.

1 ответ

Решение

О, аккуратно. Я наконец-то понял, как это сделать. Во-первых, некоторые ограничения:

  • С https это работает только для доменов по вашему сертификату. Так что я не могу использовать mydomain.com а также slashdot.org если я не CmdrTaco. Это нормально, мой сертификат AWS ACM включает в себя три домена, один из которых является моим настоящим доменом. Я позвоню actualdomain.com ниже.
  • Это не может быть сделано по запросу зрителя, только запрос источника, как host только для чтения для запроса зрителя.

Учитывая это, я использовал " Пример: использование триггера запроса источника для перехода от источника Amazon S3 к пользовательскому источнику " с некоторыми незначительными изменениями. Вот полный лямбда-код.

'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 является действительным доменом, и любой законный домен в моем сертификате проксируется к этому месту назначения, при этом конечный пользователь фактически не видит actualdomain.com,

Другие вопросы по тегам