Игнорирование параметров GET в Varnish VCL
Хорошо, у меня есть настроенный сайт, на котором есть несколько API, которые мы предоставляем разработчикам в формате
/api/item.xml?type_ids=34,35,37®ion_ids=1000002,1000003&key=SOMERANDOMALPHANUM
В этом URI type_ids всегда устанавливается, region_ids и key являются необязательными.
Важно отметить, что ключевая переменная не влияет на содержание ответа. Он используется для внутреннего отслеживания запросов, чтобы мы могли идентифицировать людей, которые делают медленные или иным образом нежелательные запросы.
В Varnish у нас есть такой VCL:
if (req.http.host ~ "the-site-in-question.com") {
if (req.url ~ "^/api/.+\.xml") {
unset req.http.cookie;
}
}
Мы просто удаляем куки-файлы и позволяем бэкенду делать все остальное, что касается времени (это взлом, поскольку Rails/authlogic отправляет сеансовые куки-файлы с ответами API).
В настоящее время, однако, любые отдельные разработчики в основном используют разные кэши, так как &key=SOMEALPHANUM
считается частью хэша Varnish для хранения. Это, очевидно, не очень хорошее решение, и я пытаюсь понять, как сказать Varnish игнорировать эту часть URI.
3 ответа
Если вам нужно покинуть key=SOMEALPHANUM
не затрагивается серверной частью в случае, если она не доставлена из кэша, тогда может быть лучше regsub
в пределах vcl_hash
функция вместо этого, поскольку это не будет действительно изменять URL, но вместо этого он просто меняет хэш ключа.
sub vcl_hash {
if(req.http.host ~ "the-site-in-question.com" & req.url ~ "^/api/") {
set req.http.X-Sanitized-URL = req.url;
set req.http.X-Sanitized-URL = regsub(req.http.X-Sanitized-URL, "&key=[A-Za-z0-9]+", "");
set req.hash += req.http.X-Sanitized-URL;
} else {
set req.hash += req.url;
}
set req.hash += req.http.host;
hash;
}
В vcl_recv
установить req.url = regsub(req.url, "&key=.*$", "");
Аналогичен ответу по cd34, но с учетом возможности разных порядков для параметров запроса и исходя из того, что проблема определяет значение как буквенно-цифровое:
set req.url = regsub(req.url, "&key=[A-Za-z0-9]*", "");
(Я пока не могу комментировать, иначе это будет комментарий к ответу cd34)