0

问题: 当通过 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;
    }
  }

结果:

  1. 测试 php url 按预期工作。IE。http://domain.com/esitest.php
  2. Wordpress url 没有处理 esi include。esi:remove它在标签下显示内容。但是 ttl 显示 15 分钟,如果标题存在则设置。这意味着它会通过 vcl 中进行 esi 处理的循环。

注意:我们使用 batcache 和 memcache 存储、Nginx Web 服务器(禁用 gzip)。

4

0 回答 0