Как в Varnish прочитать заголовок ответа Set-Cookie?

Я пытаюсь определить, установило ли мое приложение файл cookie, который содержит «предупреждающее сообщение» для пользователя на следующей странице, где Javascript отображает его при обнаружении.

В моем vcl_fetch() мне нужно определить, появляется ли конкретное значение файла cookie "alert_message" где-либо в заголовке Set-Cookie (предположительно, в переменной VCL beresp.http.Set-Cookie). Если обнаружена, я не хочу кэшировать эту следующую страницу (поскольку Varnish по умолчанию удаляет заголовок Set-Cookie, что уничтожит предупреждающее сообщение до того, как оно вернется в браузер).

Итак, вот мой простой тест:

if(beresp.http.Set-Cookie ~ "alert_message") {
    set req.http.no_cache = 1;
}

Как ни странно, он не может быть оценен как true.

Поэтому я бросаю переменную в заголовок сервера, чтобы посмотреть, как она выглядит:

set beresp.http.Server = " MyApp Varnish implementation - test reading set-cookie: "+beresp.http.Set-Cookie;

Но по какой-то причине это отображает только строку FIRST Set-Cookie в заголовках ответа.

Вот соответствующие заголовки ответа:

Server: MyApp Varnish implementation - test reading cookie: elstats_session=7d7279kjmsnkel31lre3s0vu24; expires=Wed, 10-Oct-2012 00:03:32 GMT; path=/; HttpOnly
Set-Cookie:app_session=7d7279kjmsnkel31lre3s0vu24; expires=Wed, 10-Oct-2012 00:03:32 GMT; path=/; HttpOnly
Set-Cookie:alert_message=Too+many+results.; expires=Tue, 09-Oct-2012 20:13:32 GMT; path=/; domain=.my.app.com
Set-Cookie:alert_key=flash_error; expires=Tue, 09-Oct-2012 20:13:32 GMT; path=/; domain=.my.app.com
Vary:Accept-Encoding

Как прочитать и запустить обнаружение строк во ВСЕХ строках заголовков Set-Cookie?


person Adam Friedman    schedule 09.10.2012    source источник
comment
Вы должны установить свой http.Server в resp, а не в beresp (в vcl_deliver)   -  person Doomsday    schedule 10.10.2012


Ответы (1)


Вы можете решить эту проблему с помощью функции header.get из заголовка vmod (версия Varnish >= 3)

Например, у меня есть простой PHP-скрипт и в нем несколько Set-Cookie:

 <?php
 setcookie ("Foo", "test", time() + 3600);
 setcookie ("Bar", "test", time() + 3600);
 setcookie ("TestCookie", "test", time() + 3600);
 ?>

По умолчанию только первый заголовок Set-Cookie будет проанализирован с помощью 'if(beresp.http.Set-Cookie ~ "somedata"'. Конечно, мы можем использовать процедуру std.collect из vmod std (уже поставляется с Varnish 3 и не требует компиляции), чтобы свернуть все наши заголовки Set-Cookie. к одному, но это сломает куки - Bar и TestCookie не будут установлены.

header.get позволяет избежать этого дефекта: он проверяет все заголовки на соответствие регулярному выражению:

 if (header.get(beresp.http.set-cookie,"TestCookie=") ~ "TestCookie")
 {
     set beresp.http.cookie-test = 1;
     return(hit_for_pass);
 }

Итак, с ним я получил заголовки ответа на первый и следующий запросы:

cookie-test:1
Set-Cookie:Foo=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
Set-Cookie:Bar=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
Set-Cookie:TestCookie=test; expires=Tue, 09-Oct-2012 22:33:37 GMT
X-Cache:MISS

Если я закомментирую setcookie для cookie TestCookie, то буду получать HIT при следующих запросах.

person ghloogh    schedule 09.10.2012