Varnish 4 VCL - удалить все куки и просмотреть Varnishlog

Итак, в настоящее время я разрабатываю коробку с Varnish 4, и мне любопытно, что такое нормальный (хотя, если все онлайн-примеры указывают на то, что он удаляет только известные файлы cookie) подход к файлам cookie? Удаляет ли он все файлы cookie и вносит в белый список известные файлы cookie? Это кажется немного более разумным, вот что мне любопытно. После просмотра https://www.varnish-cache.org/trac/wiki/VCLExampleRemovingSomeCookies в самом низу показывают, как удалить все, кроме НЕКОТОРЫХ (белый список), а потом прямо под заголовком говорят (осторожно - некрасиво).

Вот фрагмент:

sub vcl_recv {
if (req.http.Cookie) {
set req.http.Cookie = ";" + req.http.Cookie;
set req.http.Cookie = regsuball(req.http.Cookie, "; +", ";");
set req.http.Cookie = regsuball(req.http.Cookie, ";(COOKIE1|COOKIE2)=", "; \1=");
set req.http.Cookie = regsuball(req.http.Cookie, ";[^ ][^;]*", "");
set req.http.Cookie = regsuball(req.http.Cookie, "^[; ]+|[; ]+$", "");

if (req.http.Cookie == "") {
    remove req.http.Cookie;
}
}

Во-первых, кто-то просто выбросил эту (предупреждение - не очень красиво) часть, потому что это не совсем оптимальная настройка или в смысле «эй, это будет кошмар, пытаясь принять пользовательские отчеты» или что-то в этом роде?

Второе, что меня интересует (подтверждение! :P), это буквально удалит все без исключения файлы cookie за пределами одного имени COOKIE1|COOKIE2, верно?

И последнее, что меня интересует в этом фрагменте, где COOKIE1|COOKIE2 (я не очень хорошо знаю регулярное выражение), означает ли это, что я могу заменить COOKIE1, скажем, на __bilbobaggins (настоящее имя файла cookie __bilbobaggins=1;134;onewasaring ), а затем COOKIE2 с 1_2_3__4_cookiename (настоящее имя файла cookie 1_2_3__4_cookiename=this,is,another,cookie), и это позволит им пройти без каких-либо регулярных выражений или чего-то еще для передачи фактических данных файла cookie?

Я, к сожалению, не думаю, что это так просто, хотя?


Кроме того, независимо от вышеописанного подхода, существует ли какой-либо синтаксис Varnish 4 лаклога, который я могу использовать для мониторинга ТОЛЬКО файлов cookie, которые попадают в серверную часть?


person alturic    schedule 04.03.2015    source источник


Ответы (1)


Что касается вашего первого вопроса, я бы сказал, что он больше касается читабельности, чем производительности. Если вы понимаете код и вам удобно с ним, я не вижу никаких проблем.

Ответ на ваш второй вопрос - да, он сохранит COOKIE1 и COOKIE2. Убедиться в этом можно с помощью лактеста. Обратите внимание, что вам нужно переименовать «remove» в «unset» (удаление специфично для Varnish 3).

Что касается последнего вопроса, правильно, вы можете заменить COOKIE1 и COOKIE2 на имена настоящих файлов cookie. Только имейте в виду, что вам нужно кодировать ";".

Для другого подхода проверьте файл cookie vmod по адресу https://github.com/lkarsten/libvmod-cookie.

Что касается лаклога, вы можете использовать:

varnishlog -I BereqHeader:^Cookie

person fgsch    schedule 04.03.2015
comment
Когда вы говорите кодировать ';' что именно ты имеешь ввиду? Я не могу просто заменить (COOKIE1|...) на (_ga|COOKIE2), и это позволит любому файлу cookie с _ga попасть в серверную часть? Давайте также возьмем WordPress в качестве реального примера, если бы я использовал этот код выше, он удалит все файлы cookie, чтобы они не попали в серверную часть, а Varnish кэширует их, но могу ли я использовать регулярное выражение в части (COOKIE1|...) поэтому я могу сделать: (wp-settings-[0-9]*|COOKIE2) и файл cookie wp-settings-953=blahblahblah12388,203992,X00; (обратите внимание на цифры перед =) будут пропущены, и, очевидно, Varnish не будет его кэшировать? - person alturic; 04.03.2015
comment
В настоящее время у меня есть set req.http.Cookie = regsuball(req.http.Cookie, "wp-settings-[0-9]*=[^;]+(; )?", ""); и, судя по всему, это удаляет имя файла cookie, о котором я упоминал выше, но, как я уже сказал, я не знаю, разрешено ли регулярное выражение в этом подходе. - person alturic; 04.03.2015