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, "(\?\&)|(\&)", "\?");