Могу ли я «игнорировать» переменные строки запроса перед извлечением совпадающих объектов из кеша, но фактически не удалять их из URL-адреса для конечного пользователя?
Например, все маркетинговые utm_source
, utm_campaign
, utm_*
значения не меняют содержание страницы, они просто сильно различаются от кампании к кампании и используются во всем нашем отслеживании на стороне клиента.
Это также означает, что URL-адрес не может измениться на стороне клиента, но он должен каким-то образом «нормализоваться» в кеше.
По сути, я хочу все это ...
http://site.com/page/?utm_source=google
http://site.com/page/?utm_source=facebook&utm_content=123
http://site.com/page/?utm_campaign=usa
... для всех обращений HIT кеш для http://site.com/page/
Однако этот URL-адрес вызовет MISS (поскольку параметр не является параметром utm_ *)
http://site.com/page/?utm_source=google&variation=5
Запустит кеш для
http://site.com/page/?variation=5
Кроме того, имея в виду, что URL-адрес, который видит пользователь, должен оставаться прежним, я не могу перенаправить на что-то без параметров или любого другого подобного решения.
Да, но для этого вы должны переопределить значение по умолчанию vcl_hash. Это опасно только потому, что люди забывают, как работает лак. Помните, что логика по умолчанию добавлен ко всему, что вы предоставляете. Поэтому, если вы хотите изменить что-то подобное, вы должны полностью воспроизвести логику по умолчанию, изменить ее по своему вкусу, а затем предотвратить запуск логики по умолчанию с помощью return
в конце.
Вот vcl_hash по умолчанию из удобной мне версии. Насколько мне известно, это был тот же код, начиная с версии 1.0, поэтому он, вероятно, совпадает с вашим; проверьте свой default.vcl, чтобы быть уверенным.
sub vcl_hash {
hash_data(req.url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
Это довольно просто: объекты различаются по URL-адресу и либо по заголовку Host, либо по IP-адресу, к которому подключился клиент.
Что бы вы хотели сделать, чтобы просто заменить первую строку (hash_data(req.url)
) с (псевдо):
set myurl = req.url minus utm bits;
hash_data(myurl);
Однако вы не можете этого сделать, потому что, если вы это сделаете, следующее, что произойдет, это хеширование всего URL! Помните, что VCL по умолчанию выполняется всегда. Итак, мы должны заменить все это:
sub vcl_hash {
set stripped_url = regsuball(req.url,"([?&])utm_[^&?;]*","\1");
# Now we potentially have foo.php?bar=baz&&&&thing=true
set stripped_url = regsuball(stripped_url,"&[&]*","&");
# Lastly, let's fix foo.php?utm_foo=bar -> foo.php?
set stripped_url = regsuball(stripped_url,"\?$","");
hash_data(stripped_url);
if (req.http.host) {
hash_data(req.http.host);
} else {
hash_data(server.ip);
}
return (lookup);
}
И последнее предостережение: обратите внимание, что это НЕПРОВЕРЕННЫЙ. Но он должен по крайней мере недвусмысленно передавать идею. Сообщите мне об ошибках, если вы их обнаружите, и я с радостью исправлю код.