Вырезание выбирает пары атрибутов/значений querystring, поэтому лак не будет изменять кэш ими
Моя цель - "белый список" определенных атрибутов querystring и их значений, поэтому лак не будет изменять кеш между URL-адресами.
Пример:
Url 1: http://foo.com/someproduct.html?utm_code=google&type=hello
Url 2: http://foo.com/someproduct.html?utm_code=yahoo&type=hello
Url 3: http://foo.com/someproduct.html?utm_code=yahoo&type=goodbye
В приведенном выше примере я хочу, чтобы белый список "utm_code", но не "type". После того, как первый URL-адрес попал, я хочу, чтобы лак обслуживал этот кешированный контент ко второму URL-адресу.
Однако, в случае третьего URL-адреса, значение атрибута "type" отличается, так что это должно быть пропуском кэша лака.
Я попробовал два метода ниже (найдено в статье справки drupal, которую я не могу найти сейчас), которая, похоже, не работает. Возможно, потому, что у меня неправильное выражение.
# 1. strip out certain querystring values so varnish does not vary cache.
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
# 2. strip out certain querystring values so varnish does not vary cache.
set req.url = regsuball(req.url, "([\?|&])utm_campaign=[^&\s]*&?", "\1");
set req.url = regsuball(req.url, "([\?|&])foo_bar=[^&\s]*&?", "\1");
set req.url = regsuball(req.url, "([\?|&])bar_baz=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
Ответы
Ответ 1
Я понял это и хотел поделиться. Я нашел этот код, который делает подпрограмму, которая делает то, что мне нужно.
sub vcl_recv {
# strip out certain querystring params that varnish should not vary cache by
call normalize_req_url;
# snip a bunch of other code
}
sub normalize_req_url {
# Strip out Google Analytics campaign variables. They are only needed
# by the javascript running on the page
# utm_source, utm_medium, utm_campaign, gclid, ...
if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") {
set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.-_A-z0-9]+&?", "");
}
set req.url = regsub(req.url, "(\?&?)$", "");
}
Ответ 2
Что-то не так с RegEx.
Я изменил RegExes, используемые в обоих вызовах regsub:
sub normalize_req_url {
# Clean up root URL
if (req.url ~ "^/(?:\?.*)?$") {
set req.url = "/";
}
# Strip out Google Analytics campaign variables
# They are only needed by the javascript running on the page
# utm_source, utm_medium, utm_campaign, gclid, ...
if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=") {
set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%\._A-z0-9-]+&?", "");
}
set req.url = regsub(req.url, "(\?&|\?|&)$", "");
}
Первое изменение - это часть [%._ A-z0-9-] ", потому что черточка функционировала как символ диапазона, поэтому я переместил ее до конца, и точка должна быть экранирована.
Второе изменение - не только удалить вопросительный знак на оставшемся URL-адресе, но также амперсанд или знак вопроса и амперсанд.
Ответ 3
Из https://github.com/mattiasgeniar/varnish-4.0-configuration-templates:
# Some generic URL manipulation, useful for all templates that follow
# First remove the Google Analytics added parameters, useless for our backend
if (req.url ~ "(\?|&)(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=") {
set req.url = regsuball(req.url, "&(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "");
set req.url = regsuball(req.url, "\?(utm_source|utm_medium|utm_campaign|utm_content|gclid|cx|ie|cof|siteurl)=([A-z0-9_\-\.%25]+)", "?");
set req.url = regsub(req.url, "\?&", "?");
set req.url = regsub(req.url, "\?$", "");
}
Ответ 4
Вы хотите вырезать utm_code
, но это не распространяется на любое из используемых вами регулярных выражений.
Попробуйте следующее:
# Strip out specific utm_ values from request URL query parameters
set req.url = regsuball(req.url, "([\?|&])utm_(campaign|content|medium|source|term|code)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
Или, если вы хотите удалить все параметры URL, начинающиеся с utm_
, вы можете пойти с:
# Strip out ALL utm_ values from request URL query parameters
set req.url = regsuball(req.url, "([\?|&])utm_(\w+)=[^&\s]*&?", "\1");
# get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
Ответ 5
Копия runamok, но у меня есть + вместо %20 в моих параметрах, поэтому я добавил это в мое регулярное выражение
sub vcl_recv {
# strip out certain querystring params that varnish should not vary cache by
call normalize_req_url;
# snip a bunch of other code
}
sub normalize_req_url {
# Strip out Google Analytics campaign variables.
# I allso stribe facebook local that are use for facebook javascript.
# They are only neededby the javascript running on the page
# utm_source, utm_medium, utm_campaign, gclid, ...
if(req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|fb_local|mr:[A-z]+)=") {
set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|fb_local|mr:[A-z]+)=[%.+-_A-z0-9]+&?", "");
}
set req.url = regsub(req.url, "(\?&?)$", "");
}
Ответ 6
Вы, ребята, попробовали?
https://github.com/Dridi/libvmod-querystring
Пример
set req.url = querystring.regfilter(req.url, "utm _. *" );
Ответ 7
Я немного поработал над runamok, добавив поддержку пустых параметров и отсортировав оставшиеся, вот полный файл vtc, который я выполнил для проверки правильности.
varnishtest "Test for URL normalization - Varnish 4"
server s1 {
rxreq
txresp -hdr "Backend: up" -body "Some content"
} -repeat 11 -start
varnish v1 -vcl+backend {
import std;
sub vcl_recv {
# Strip out marketing variables. They are only needed by
# the javascript running on the page.
if (req.url ~ "(\?|&)(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)(=|&|$)") {
# Process params with value.
set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=[%.\-_A-z0-9]+&?", "");
# Process params without value.
set req.url = regsuball(req.url, "(gclid|cx|ie|cof|siteurl|zanpid|origin|utm_[a-z]+|mr:[A-z]+)=?(&|$)", "");
}
# Remove trailing '?', '?&'
set req.url = regsub(req.url, "(\?&?)$", "");
# Sort query params, also removes trailing '&'
set req.url = std.querysort(req.url);
}
sub vcl_deliver {
set resp.http.X-Normalized-URL = req.url;
}
} -start
client c1 {
# Basic, no params.
txreq -url "/test/some-url"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# One blacklisted param.
txreq -url "/test/some-url?utm_campaign=1"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# One blacklisted param, without value.
txreq -url "/test/some-url?utm_campaign"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Two blacklisted params.
txreq -url "/test/some-url?utm_campaign=1&origin=hpg"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Two blacklisted params, one without value
txreq -url "/test/some-url?utm_campaign&origin=123-abc%20"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Two blacklisted params, both without value
txreq -url "/test/some-url?utm_campaign&origin="
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Three blacklisted params.
txreq -url "/test/some-url?utm_campaign=ABC&origin=hpg&siteurl=br2"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Three blacklisted params, two without value
txreq -url "/test/some-url?utm_campaign=1&origin=&siteurl"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url"
# Three blacklisted params; one param to keep, with space encoded as +.
txreq -url "/test/some-url?qss=hello+one&utm_campaign=some-value&origin=hpg&siteurl=br2"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url?qss=hello+one"
# Three blacklisted params; one param to keep, with space encoded as %20, passed in-between blacklisted ones.
txreq -url "/test/some-url?utm_campaign=1&qss=hello%20one&origin=hpg&siteurl=br2"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url?qss=hello%20one"
# Three blacklisted params; three params to keep.
txreq -url "/test/some-url?utm_campaign=a-value&qss=hello+one&origin=hpg&siteurl=br2&keep2=abc&keep1"
rxresp
expect resp.http.X-Normalized-URL == "/test/some-url?keep1&keep2=abc&qss=hello+one"
} -run
varnish v1 -expect client_req == 11