问题: 当通过 Wordpress 调用 URL 时,Varnish (ver 3.0) 似乎无法处理 esi。
背景: 想法是缓存文章页面或任何静态页面(Wordpres 站点)更长的时间,但对于某些动态小部件。为此,我们设置编写了一个php页面,通过single.php和header.php生成侧边栏和菜单页面。这些还将包括一个名为“Set-Esi”的标题。
如果 Varnish 检测到标头的存在,它将处理 ESI。
测试: 我们在站点的根目录中添加了一个 php 页面。让我们说'esitest.php'。在这个页面中,我们有标题,调用小部件菜单并回显日期时间以进行测试。
PHP测试页面代码
Varnish VCL(在 vcl_fetch 下,ver 3.0):
if (req.http.host ~ "(dev.|beta.|beta1.)domain.com$") {
## Perform ESI TTL setting:
if (beresp.http.Set-Esi){
set beresp.do_esi = true;
set beresp.ttl = 15m;
}
else if (req.url ~ "(esisidebar.php|esimenu.php|esimorefromcategory.php)") {
set beresp.ttl = 3s;
}
else if (req.url ~ "^/wp-admin/admin-ajax.php") {
set beresp.ttl = 3m;
}
else {
set beresp.ttl = 5m; unset beresp.http.expires; unset req.http.Cookie;
}
}
结果:
- 测试 php url 按预期工作。IE。
http://domain.com/esitest.php
- Wordpress url 没有处理 esi include。
esi:remove
它在标签下显示内容。但是 ttl 显示 15 分钟,如果标题存在则设置。这意味着它会通过 vcl 中进行 esi 处理的循环。
注意:我们使用 batcache 和 memcache 存储、Nginx Web 服务器(禁用 gzip)。