Varnish - Сравните req.url с динамическим значением cookie - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь создать систему, в которой 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.

1 Ответ

0 голосов
/ 21 октября 2018

Итак, первое предупреждение: очень опасно позволить пользователям решать (или, по крайней мере, сказать вам), какой лак должен кэшироваться или нет.

Кроме того, второе предупреждение: это как супер-мега опасно, когда пользователи даютВы выполняете регулярные выражения.

У вас действительно должен быть список ролей и соответствующие пути для хранения на стороне сервера, возможно, в CMS, и используйте restarts, vmod_curl или vmod_http, чтобы спросить его, следует ли их обслуживать (очевидно, кешируя ответ в течение некоторого времени).

Теперь, чтобы ответить на оригинальный вопрос, вы можете взглянуть на UPLEX 're2 vmod: https://code.uplex.de/uplex-varnish/libvmod-re2/, он позволит вам использовать регулярное выражение в качестве переменной, ноеще раз: это будет извилистый и опасный путь.

...