Любая связь между родительским запросом и подзапросами ESI (лак, потребности сеанса)?

Я пытаюсь работать с лаком.

Моя проблема в том. У меня есть основной запрос/ответ, который я хочу кэшировать с помощью лака. Внутри 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, но мне подойдет любое решение.

Заранее спасибо.


person BartłomiejNoszka    schedule 26.09.2014    source источник


Ответы (1)


Можно преобразовать переменные из основного запроса в подзапросы ESI с помощью libvmod-var, однако это не очень документировано, но отлично работает в текущей версии libvmod-var и лака 3.0.6.

person Christian    schedule 20.11.2014