Лак vcl_hash для удаления параметра - PullRequest
4 голосов
/ 13 декабря 2011

Я использую Varnish 2.0.6 , и у меня возникают проблемы с поиском хорошей документации для написания функции vcl_hash.

Мне нужно удалить несколько параметров из URL-адресамой API до кеширования.В частности, идентификатор пользователя, который передается для отслеживания аналитики, но не для изменения результатов.

URL: /api/browse?node=123&userid=3432432564363

Я написал это, но мне не совсем понятно, должна ли функция vcl_hash заканчиваться на 'hash' или 'return (hash) 'или НИЧЕГО, и если мне нужно разобраться со всеми делами или только с моим специальным деломМне не ясно, перезаписываю ли я метод или расширяю его.

У меня есть:

sub vcl_hash {
  if (req.url ~ "^/api/browse") {
    set req.hash += regsuball(req.url,"&userid=([A-z0-9]+)","");
  } 
  hash;
}

Что-то упущено?

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я проверил несколько вещей, и, кажется, это работает:

sub vcl_hash {
  if (req.url ~ "^/api/browse") {
    set req.hash += regsuball(req.url,"&userid=([A-z0-9]+)","");
  } else {
    set req.hash += req.url;
  }
  set req.hash += req.http.host;
  hash;
}

Похоже, вам также нужно обрабатывать случай по умолчанию при перезаписи vcl_hash.

0 голосов
/ 13 ноября 2018

Ниже приведено общее решение, которое работает для меня (начиная с varnish v4), чтобы удалить несколько нежелательных параметров.

Список параметров может быть легко расширен до тех пор, пока значение-регулярное выражение совпадает: регулярное выражение-значение соответствует всем символам, безопасным для URL, поэтому оно должно совпадать для всех параметров, закодированных в URL.

sub vcl_hash {
    # conditional replacement is faster then evaluating regexes all the time
    if (req.method == "GET" || req.method == "HEAD") {
        hash_data(regsuball(req.url, "(userid|sid|uid)=[%.-_~A-z0-9]+&?", ""));
    }
    else {
        hash_data(req.url);
    }
    hash_data(req.http.host);
    return (lookup);
}
...