Я пытаюсь создать систему, в которой CMS (в данном случае Drupal) может установить значение cookie (в зависимости от ролей пользователя и т. Д.), Которое будет хранить в cookie динамическое количество путей, которые должен обслуживать Varnish, а непередать в Drupal CMS.
Вот пример того, как выглядит мой заголовок cookie
cookie: SESS25dJds8sdkjhas324c0352a47f7fd=k16ZxR_095akCmg889utcGSw8ryz2vrG7zzIuQvDCFA; Drupal.visitor.varnish_enabled=1; Drupal.visitor.varnish_mode=exclude; Drupal.visitor.varnish_pages=%2Fuser%0D%0A%2Fuser%2F%2A%0D%0A%2Fnode%2F3
Итак, пути, заданные в файле cookie Drupal.visitor.varnish_pages:
/user
/user/*
/node/3
Мне нужно посмотреть, равно ли req.url какому-либо из этих значений.
Как видно выше, чтобы сделать вещи немного сложнее, некоторые пути в Drupalcookie также содержат символ подстановки звездочки.Например, если бы я хотел, чтобы все пути, такие как /node/[node-id]
, обслуживались Varnish, я бы установил значение cookie как /node/*
.Я попытался создать регулярное выражение на основе значений в файле cookie, чтобы сравнить его с req.uri, и мое регулярное выражение является действительным - как я это подтвердил, используя regex101.com и некоторые примеры данных cookie, но Лак не любит регулярные выражения в переменных.Вот что у меня есть:
# Check the cookie for the custom data. This way we can control whether
# to serve up static caches of the page, or bypass the varnish cache and let
# Drupal serve up the content.
if (req.http.Cookie ~ "(^|;\s*)(Drupal.visitor.varnish_enabled=1)(;|$)") {
set req.http.custom_paths = regsub(req.http.Cookie, "(?:^|.*;\s*)(?:Drupal\.visitor\.varnish_pages=)(.*?)(?:;.*|$)", "\1");
set req.http.varnish_paths_pattern = regsuball(req.http.as_paths, "%0D%0A", "|");
set req.http.varnish_paths_pattern = regsuball(req.http.varnish_paths_pattern, "%2A", "[.*]");
set req.http.varnish_paths_pattern = regsuball(req.http.varnish_paths_pattern, "%2F", "/");
set req.http.varnish_paths_pattern = "(?i)(" + req.http.varnish_paths_pattern + ")";
# We are in include mode, so varnish should only trigger for the
# specified paths.
if (req.http.Cookie ~ "(^|;\s*)Drupal\.visitor\.varnish_mode=include(;|$)") {
if (req.url ~ req.http.varnish_paths_pattern) {
set req.http.X-Custom-Varnish = true;
unset req.http.Cookie;
}
}
# We are in exclude mode, so varnish should trigger for all paths except
# the specified paths.
if (req.http.Cookie ~ "(^|;\s*)Drupal\.visitor\.varnish_mode=exclude(;|$)") {
if (req.url !~ req.http.varnish_paths_pattern) {
set req.http.X-Custom-Varnish = true;
unset req.http.Cookie;
}
}
unset req.http.varnish_paths_pattern;
unset req.http.varnish_paths;
}
После прочтения я знаю, что регулярные выражения на лаке не компилируются во время выполнения, поэтому использование регулярного выражения с шаблоном, хранящимся в переменной, не работает - я 'Я проверил это, и оно не работает.
Так как я мог подойти к этому вопросу?Мне нужно иметь возможность определить, является ли текущий путь одним набором в значении cookie, но эти значения cookie являются полностью динамическими и контролируются CMS.