Лак 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);
}