Я пытаюсь работать с лаком.
Моя проблема в том. У меня есть основной запрос/ответ, который я хочу кэшировать с помощью лака. Внутри html-структуры есть тег ESI. Я хочу, чтобы их было много. Один тег с более длинным ttls и другие с ttl=0s
; (содержимое ESI с окном входа).
В любом случае, я хочу, чтобы лак попадал в основной запрос, но запрашивал у бэкэнд-контента ESI некоторую информацию, например заголовки. Когда содержимое ESI возвращается (потому что я понимаю, что сначала это родительский запрос, а затем подзапрос с ESI), я хочу иметь какую-то связь.
Помните, что изменения, внесенные в beresp, впоследствии сохраняются в obj. А переменные resp.* — это копии того, что должно быть возвращено — возможно, obj. Другими словами, изменение beresp повлияет на будущие переменные obj.* и соответственно*. Аналогичная семантика применяется к req.* и bereq.. bereq. — это «бэкэнд-запрос», созданный из исходного запроса. Это может немного отличаться — например, Varnish может преобразовывать запросы HEAD в GET.
из https://www.varnish-software.com/static/book/VCL_functions.html
Например: если подзапрос ESI имеет заголовок "X-ESI-Cookie"
в ответе, я хочу передать его в основной ответ.
Единственный способ узнать что-либо об ESI — это reg.esi_level
.
if (req.esi_level > 0 ) {
set req.http.*;
}
В основном, чего я хочу добиться, так это:
Я хочу, чтобы лак кэшировал всю мою страницу, но для управления сеансом передается содержимое ESI, но для сохранения сеанса мне нужно передать некоторые заголовки из подчиненного (ESI) в родительский ответ (но я считаю, что это очевидно).
Я считаю, что запросы на лакировку (родительские и ESI) обрабатываются отдельно, а это значит, что у меня не будет возможности общаться. Varnish просто заменяет тег на html из ответа ESI. Это так?
Я начинаю верить, что для этого нет решения, но, может быть, у кого-то есть лучшее решение этой проблемы: как сохранить сеанс? Я нашел несколько решений, но ни одно из них не соответствует моим потребностям. (Я верил с Fake-Session, где ID был сгенерирован Varnish с некоторым кодом C, но без блокировки).
Я хочу сделать это таким образом, потому что мне было бы намного проще принять текущее приложение symfony2. Во всяком случае, я не могу поверить, что symfony2 не ожидал такой возможности. Мои страницы в основном статичны, за исключением нескольких виджетов (контент ESI).
Было бы очень неплохо иметь содержимое ESI (запрос, содержимое и ответ) для объектной переменной:
obj.*
Я не могу поверить, что объект лака не имеет никакой информации о содержимом ESI.
Важно отметить, что я ищу решение в конфигурации *.vcl, но мне подойдет любое решение.
Заранее спасибо.