Гуру Varnish/VCL: как передать тело запроса с помощью выборки Varnish?

Боюсь, я новичок в лакировании, но у меня есть проблема, решение которой я нигде не могу найти (пока): Varnish настроен на кэширование GET-запросов. У нас есть несколько запросов, у которых так много параметров, что мы решили передать их в теле запроса. Это прекрасно работает, когда мы обходим Varnish, но когда мы проходим через Varnish (для кэширования), запрос передается без тела, поэтому служба, стоящая за Varnish, дает сбой.

Я знаю, что мы могли бы использовать POST, но мы хотим получить данные. Я также знаю, что Varnish МОЖЕТ передать тело запроса, если мы используем режим передачи, но, насколько я вижу, запросы, сделанные в режиме передачи, не кэшируются. Я уже поместил хэш в URL-адрес, так что, когда все заработает, мы действительно получим правильные данные из кеша (что касается URL-адреса, в противном случае все вызовы будут выглядеть одинаково).

Теперь проблема заключается в том, как «просто» переписать vcl_fetch, чтобы передать тело запроса веб-серверу? Любые подсказки и советы приветствуются!

заранее спасибо

Джон


person Jon Gilbert    schedule 11.09.2011    source источник
comment
Итак, вам нужны запросы HTTP GET с телом запроса? Я не думал, что это возможно, пока не нашел вопрос на этом сайте: http://stackoverflow.com/questions/978061/http-get-with-request-body . Это возможно, но не рекомендуется. Я могу себе представить, что лак не реализует этот случай....   -  person ivy    schedule 12.09.2011
comment
Я знаю, что это не рекомендуется, но разрешено... и помогает обойти ограничения длины URL. лак поддерживает его в режиме прохода, но не кэширует результаты. кажется, они не поддерживают его (пока?) в режиме выборки... и в режиме выборки ответ может быть кэширован. :((   -  person Jon Gilbert    schedule 12.09.2011


Ответы (2)


Я не думаю, что вы можете, но даже если вы можете, это очень опасно: Varnish не будет хранить тело запроса в кеше или хеш-таблице, поэтому он не сможет увидеть никакой разницы между двумя запросами с одним и тем же URI и другое тело.

Я не слышал о ключе VCL для чтения тела запроса, но если он существует, вы можете передать его в req.hash для дифференциации запросов.

В любом случае, тело запроса должно использоваться только с POST или PUT... и запросы POST/PUT не должны кэшироваться.

Тело запроса должно отправлять данные на сервер. Кэш используется для получения данных...

Я не знаю подробностей, но я думаю, что в вашем процессе есть проблема с дизайном...

person Gauthier Delacroix    schedule 01.12.2011
comment
PS: Если вы передаете свои запросы (событие передачи VCL), все будет работать как положено, но не будет кэшироваться. - person Gauthier Delacroix; 01.12.2011

Я не уверен, что правильно понял ваш вопрос, но если вы попытаетесь каким-то образом взаимодействовать с телом запроса, это невозможно с VCL. Для этого у вас нет переменной/подпрограммы VCL.

Вы можете найти список переменных, доступных в VCL здесь (или в man vcl):

Я согласен с Готье, у вас, кажется, проблема с дизайном в вашей системе.

'Надеюсь, это поможет.

person Jérôme R    schedule 29.12.2011
comment
эта ссылка мертва - person jononomo; 11.04.2017