Вот функция:
ользую CloudFront в качестве кэша перед моим веб-приложением Symfony. Чтобы получить кэш на основе роли пользователя (admin, customer, ...), я генерирую хэш на основе роли пользователя в триггере Lambda @ Edge Viewer Request. Я передаю этот хеш как заголовок запроса моему источнику какX-User-Context-Hash
.
Моя проблема сейчас в том, что мне нужно сдатьPHPSESSID
cookie для моего источника, чтобы получить правильный ответ для кэширования, но я не хочу основывать кэш на значенииPHPSESSID
, Мне нужен только мой кэшированный ответ, основанный на значенииX-User-Context-Hash
но не в моем сессионном cookie.
Изображение ниже должно объяснить мою проблему в деталях
Есть ли возможность сделать это?
Буду признателен за любую помощь.
Вот мой триггер Lambda @ Edge Viewer Request:
'use strict';
function parseCookies(headers) {
const parsedCookie = {};
if (headers.cookie) {
console.log(`${headers.cookie[0].value}`);
headers.cookie[0].value.split(';').forEach((cookie) => {
if (cookie) {
const parts = cookie.split('=');
parsedCookie[,parts[0].trim()] = parts[1].trim();
}
});
}
return parsedCookie;
}
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
const headers = request.headers;
const https = require('https');
// Read session cookie
const parsedCookies = parseCookies(headers);
let cookie = '';
if (parsedCookies) {
if(parsedCookies['PHPSESSID']) {
cookie = `PHPSESSID=${parsedCookies['PHPSESSID']}`;
}
}
console.log(`Cookie: ${cookie}`);
// Send request to origin host at /_fos_user_context_hash
// passing the original session cookie
const options = {
hostname: `${request.headers.host[0].value}`,
port: 443,
path: '/_fos_user_context_hash',
method: 'HEAD',
headers: {
'Cookie': cookie,
'Accept': 'application/vnd.fos.user-context-hash',
'Vary' : 'Cookie'
}
};
const req = https.request(options, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
// Read the X-User-Context-Hash from the hash endpoint
const headerName = 'X-User-Context-Hash';
let hash = 'anonymous';
if (res.headers[headerName.toLowerCase()]) {
hash = res.headers[headerName.toLowerCase()];
}
// Append X-User-Context-Hash before passing request on to CF
request.headers[headerName.toLowerCase()] = [{ key: headerName, value: hash }];
callback(null, request);
}).on('error', (e) => {
console.error(e);
// Forward request anyway
callback(null, request);
});
req.end();
}
;