Varnish:如何缓存带参数的 URL - 需要剥离多个参数但不是全部
Varnish: how to cache a URL with parameters - need to strip multiple parameters but not all
我正在测试修改后的 Varnish 配置,我需要查看某些 URL 是否正在访问缓存。好像不喜欢多参数。
Varnish 配置更改是不将具有某些参数的 URL 视为唯一内容。例如
/news/tech
/news/tech?itq=1001
/news/tech?itq=1002&ito=3553
应该都是等价的。
场景一
请求尚未缓存的页面:
curl -I 'http://example.com/news/tech'
结果:
X-Varnish-Cache: MISS
第二次发送相同的请求会得到这样的结果:
X-Varnish-Cache: HIT
场景二
再次请求上面的URL,但是有一个参数:
curl -I 'http://example.com/news/tech?itq=1001'
这是不被视为独特内容的参数之一。
结果:
X-Varnish-Cache: HIT
场景三
请求第二个参数:
curl -I 'http://example.com/news/tech?itq=1001&ito=3553'
回复:
X-Varnish-Cache: MISS
Varnish 配置似乎适用于?但不适用于 &
这是我的 Varnish 配置中的相关行:
set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]*&?", "");
我想这只是 运行 一次,所以它不会去掉多个参数。我该怎么做?
经过一些实验,我找到了一种方法。
# Strip out query parameters that do not affect the page content
set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]+", "");
# Get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
# Replace ?&
set req.url = regsub(req.url, "(\?\&)", "\?");
第二个和第三个命令只是清理。但这似乎确实有效。
@thirtyish 的实现在与其他获取参数组合使用时会出现问题。
例如?utm_campaign=1&utm_source=2&my_add_parameter=3
不工作。
如果我们将顺序更改为 ?my_add_parameter=3=utm_campaign=1&utm_source=2
就可以了。
不工作我的意思是它在 url 查询中生成多个 &
标志。
我更新正则表达式来解决这个问题。
set req.url = regsuball(req.url, "[\?\&](utm_\w+|hsa_\w+|gclid|fbclid|pc)=[^&\s]+", "");
# trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
set req.url = regsub(req.url, "(\?\&)|(\&)", "\?");
我正在测试修改后的 Varnish 配置,我需要查看某些 URL 是否正在访问缓存。好像不喜欢多参数。
Varnish 配置更改是不将具有某些参数的 URL 视为唯一内容。例如
/news/tech
/news/tech?itq=1001
/news/tech?itq=1002&ito=3553
应该都是等价的。
场景一
请求尚未缓存的页面:
curl -I 'http://example.com/news/tech'
结果:
X-Varnish-Cache: MISS
第二次发送相同的请求会得到这样的结果:
X-Varnish-Cache: HIT
场景二
再次请求上面的URL,但是有一个参数:
curl -I 'http://example.com/news/tech?itq=1001'
这是不被视为独特内容的参数之一。
结果:
X-Varnish-Cache: HIT
场景三
请求第二个参数:
curl -I 'http://example.com/news/tech?itq=1001&ito=3553'
回复:
X-Varnish-Cache: MISS
Varnish 配置似乎适用于?但不适用于 &
这是我的 Varnish 配置中的相关行:
set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]*&?", "");
我想这只是 运行 一次,所以它不会去掉多个参数。我该怎么做?
经过一些实验,我找到了一种方法。
# Strip out query parameters that do not affect the page content
set req.url = regsuball(req.url, "([\?|\&])+(utm_campaign|utm_content|utm_medium|utm_source|utm_term|ITO|et_cid|et_rid|qs|itq|ito|itx\[idio\])=[^&\s]+", "");
# Get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
# Replace ?&
set req.url = regsub(req.url, "(\?\&)", "\?");
第二个和第三个命令只是清理。但这似乎确实有效。
@thirtyish 的实现在与其他获取参数组合使用时会出现问题。
例如?utm_campaign=1&utm_source=2&my_add_parameter=3
不工作。
如果我们将顺序更改为 ?my_add_parameter=3=utm_campaign=1&utm_source=2
就可以了。
不工作我的意思是它在 url 查询中生成多个 &
标志。
我更新正则表达式来解决这个问题。
set req.url = regsuball(req.url, "[\?\&](utm_\w+|hsa_\w+|gclid|fbclid|pc)=[^&\s]+", "");
# trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
set req.url = regsub(req.url, "(\?\&)|(\&)", "\?");