Лакируйте vcl_hash, чтобы удалить параметр

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

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

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

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

У меня есть:

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

Чего-то не хватает?


person robsf    schedule 13.12.2011    source источник


Ответы (2)


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

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.

person robsf    schedule 14.12.2011
comment
Я до сих пор не понимаю, почему я должен использовать req.hash +=, как будто я добавляю какое-то существующее значение. Какое значение?? - person robsf; 14.12.2011
comment
Какой вариант лака используете? - person Tamil; 26.07.2012

Ниже приведено общее решение, которое работает для меня (начиная с лака 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);
}
person rudi    schedule 13.11.2018