Переписать хост с облачным фронтом с помощью 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
,