Обновление: лучше собрал мои мысли
Я генерирую уникальный идентификатор (UUID) для каждого пользователя в лямбда-запросе Viewer, а затем выбираю кэшированную страницу для возврата на основе этого UUID. Это работает.
В идеале у этого пользователя всегда должен быть один и тот же UUID.
Я должен сгенерировать этот UUID в запросе Viewer , если его нет в файле cookie в этом запросе Viewer. Мне также нужно, чтобы UUID был установлен как cookie, что, конечно, происходит в ответе, а не в запросе.
Без кэширования мой сервер просто обрабатывает получение пользовательского заголовка и создание Set-Cookie в заголовке ответа.
Я не нахожу способ справиться с этим, если я хочу кэшировать страницу. Я могу проигнорировать заголовок запроса для кэширования и предоставить правильную кэшированную страницу, но тогда пользователь не сохранит этот UUID, поскольку в следующем запросе не задано использование файла cookie.
Кто-нибудь достиг такого?
Вещи, которые я пытаюсь
Есть несколько аспектов, над которыми я работаю, но пока не смог приступить к работе:
Какой-то параметр в Cloudfront, о котором я не знаю, который обрабатывает заголовок или другие данные, передаваемые из Viewer Request в Viewer Response, которые могут использоваться во второй лямбде в Cloudfront.
Преимущественно изменить заголовки объекта ответа в запросе средства просмотра. Я не думаю, что это возможно, поскольку они возвращают заголовки, которые еще не созданы, если только я не пропустил какую-то встроенную методологию Cloudfront.
Существующий сквозной заголовок какого-то рода, я не знаю, является ли это вообще чем-то, поскольку я не очень хорошо знаком с этим аспектом обработки запроса-ответа, но стоит попробовать.
Возможно (еще не пытался) я мог бы создать весь объект ответа в лямбда-запросе клиента и каким-то образом обслуживать оттуда кэшированную страницу, модифицируя заголовки ответа и передавая ее в метод обратного вызова.
Ответ Тобина на самом деле работает, но не является твердым решением. Если пользователь не хранит и не обслуживает свои куки, это становится бесконечным циклом, плюс я бы не стал создавать перенаправление перед всеми моими страницами, если смогу избежать этого
Несколько работающая концепция
- Запрос Viewer Lambda, когда UUID отсутствует в файлах cookie, генерирует UUID
- Запрос Viewer Lambda устанавливает UUID в куки на заголовок в объекте запроса. Обратный вызов с обновленным объектом запроса передан в
- Наличие UUID-файлов cookie. Кэш Cloudfront
- Запрос на отправку лямбда запускается при наличии UUID
- Исходный запрос Lambda снова вызывает URL исходного запроса через
http.get
с установленным UUID cookie (ограничение в 40 КБ делает это невозможным в Viewer Request Lambda)
- Второй сценарий для Viewer Request Lambda, видя, что UUID теперь присутствует, удаляет UUID cookie, затем продолжает запрос в обычном режиме
- Второй запрос источника, если он еще не кэширован - Кэшированный ответ, если он кэширован, так как UUID очистки кеша отсутствует - возвращает фактический HTML-код страницы в запрос первого источника
- First Origin Request получает ответ от
http.get
, содержащий HTML
- First Origin Request создает пользовательский объект ответа, содержащий тело ответа из
http.get
и заголовок Set-Cookie, установленный с нашим исходным UUID
Последующие вызовы, у которых уже установлен UUID, уберут UUID из файла cookie (чтобы предотвратить разрушение кэша) и перейдут непосредственно ко второму сценарию в лямбда-запросе Viewer, который непосредственно загрузит кэшированную версию страницы.
Я говорю «несколько», потому что, когда я пытаюсь достичь своей конечной точки, я получаю загруженный двоичный файл.
РЕДАКТИРОВАТЬ
Это потому, что я не устанавливал заголовок content-type
. У меня сейчас только 302 проблема с перенаправлением ... если я преодолею это, я выложу полный ответ.
Оригинальный вопрос
У меня есть функция запроса Viewer, которая выбирает опцию и устанавливает некоторые вещи в запросе, прежде чем он будет извлечен из кэша или сервера.
Это работает, но я хочу, чтобы он запомнил этот выбор для будущих пользователей. Идея состоит в том, чтобы просто установить cookie-файл, который я смогу прочитать при следующем входе пользователя. Поскольку это по запросу зрителя, а не по ответу зрителя, я не выяснил, как это сделать, или возможно ли это даже через саму лямбду.
Viewer Request ->
Lambda picks options (needs to set cookie) ->
gets corresponding content ->
returns to Viewer with set-cookie header intact
Я видел примеры и смог успешно установить файлы cookie в ответе Viewer через лямбду. Это не очень помогает мне, так как решение должно быть принято по запросу. Неудивительно, что добавление этого кода в запрос средства просмотра ничего не показывает в ответе.