【问题标题】:Can Varnish ESI script get the page that was on (origin page)?Varnish ESI 脚本可以获取位于(原始页面)上的页面吗?
【发布时间】:2012-08-21 10:38:53
【问题描述】:

我有一个用 Varnish 缓存的 PHP 页面:http://categories.php?name=NAME。 它有一些 ESI 脚本,例如:

所有页面都有相似的页眉、页脚、侧边栏,所以我在进行 VCL 哈希时删除了 name=NAME,这样所有页面都可以获得相同的缓存。

问题是我想在 esi.php 脚本中知道哪个页面发出了 ESI 请求。是 categories.php?name=A 还是 categories.php?name=B ?

我该怎么做?我在任何地方都没有找到此信息。

我在想它可能在 HTTP REFERER 中,但事实并非如此。 :(

【问题讨论】:

  • 如果您粘贴 vcl 文件的内容会更好。
  • 你找到这个问题的解决方案了吗?

标签: php varnish esi


【解决方案1】:

同样的问题,同样的状态。为了解决这个问题,我将父 URL 作为参数添加到 ESI URL:

<esi:include src="/esi/content/?url=http://mysite.com/parent/page/" />

【讨论】:

    【解决方案2】:

    在 vcl_recv 中试试这个:

    if (req.esi_level == 0) {
        set req.http.X-Esi-Parent = req.url;
    }   
    

    这将导致与此主请求相关的所有 esi 请求在名为“X-Esi-Parent”的请求标头中发送原始 url,该请求标头可以在后端读取。

    更新

    cmets 中的 Aleksandr 正确指出这不起作用,因为在 vcl_recv 中设置的标头不会出现在后续的 esi 请求中——只有来自客户端的标头。一些人在 listserv 上提出了类似的问题,但没有得到回答:

    https://www.varnish-cache.org/lists/pipermail/varnish-misc/2012-February/021706.html

    http://marc.info/?l=varnish-dev&m=135273366517518&w=2

    因此,如果您想在所有查询字符串组合中缓存包含 esi 标记的响应,似乎没有办法做到这一点。

    【讨论】:

    • 这不起作用。 Varnish 将尝试对 ESI 的新请求。在原始请求期间设置的所有请求标头都将丢失。
    【解决方案3】:

    Varnish 4.1开始你可以这样做:

     if (0 < req.esi_level && req_top.url ~ "found/in/parent/url") {
         ...
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      相关资源
      最近更新 更多