我正在测试修改后的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");
我想这只运行一次,因此它不会删除多个参数。我该怎么做?
答案 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, "(\?\&)|(\&)", "\?");