Лак vcl_hash для удаления параметра

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

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

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

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

Я имею:

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

Это что-то упустило?

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.

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

Список параметров может быть легко расширен до тех пор, пока значение-регулярное выражение совпадает: значение регулярного выражения соответствует всем 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);
}
Другие вопросы по тегам