Varnish:如何使用参数缓存URL - 需要删除多个参数但不是全部

时间:2015-03-12 13:41:25

标签: varnish

我正在测试修改后的Varnish配置,我需要查看某些URL是否正在访问缓存。似乎不喜欢多个参数。

Varnish配置更改是不将具有某些参数的URL视为唯一内容。 E.g。

/news/tech
/news/tech?itq=1001
/news/tech?itq=1002&ito=3553

应该都是等价的。

情景1

请求尚未缓存的网页:

curl -I 'http://example.com/news/tech'

结果:

X-Varnish-Cache: MISS

第二次发送相同的请求会得到以下结果:

X-Varnish-Cache: HIT

场景2

再次请求上述网址,但使用参数:

curl -I 'http://example.com/news/tech?itq=1001'

这是不作为独特内容处理的参数之一。

结果:

X-Varnish-Cache: HIT

场景3

请求第二个参数:

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]*&?", "\1");

我想这只运行一次,因此它不会删除多个参数。我该怎么做?

2 个答案:

答案 0 :(得分:0)

经过一些实验,我找到了一种方法。

# 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]+", "\1");
# Get rid of trailing & or ?
set req.url = regsuball(req.url, "[\?|&]+$", "");
# Replace ?&
set req.url = regsub(req.url, "(\?\&)", "\?");

第二和第三个命令只是清理。但这确实有效。

答案 1 :(得分:0)

实现@thirtyish与其他get参数组合使用时会出现问题。

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