Php 清漆不';不带过期标头的t缓存

Php 清漆不';不带过期标头的t缓存,php,caching,cache-control,varnish,Php,Caching,Cache Control,Varnish,在我的服务器上,Varnish(缓存)在端口80上运行,Apache在8080上运行。 当我设置如下标题时,Varnish缓存非常好: $this->getResponse()->setHeader('Expires', '', true); $this->getResponse()->setHeader('Cache-Control', 'public', true); $this->getResponse()->setHeader(

在我的服务器上,Varnish(缓存)在端口80上运行,Apache在8080上运行。
当我设置如下标题时,Varnish缓存非常好:

    $this->getResponse()->setHeader('Expires', '', true);
    $this->getResponse()->setHeader('Cache-Control', 'public', true);
    $this->getResponse()->setHeader('Cache-Control', 'max-age=2592000');
    $this->getResponse()->setHeader('Pragma', '', true);
但这意味着人们会缓存我的网站,而不会在其可用时检索新版本。
当我删除标题时,人们会在每次重新加载页面时检索新版本(因此Varnish从不缓存)

我不知道这里出了什么问题。

我的理想情况是,人们不在客户端缓存html,而是将其留给Varnish处理。

最简单的方法就是将最大年龄调低到更合理的程度。目前,您已将其设置为30天。尝试将其设置为15分钟:

$this->getResponse()->setHeader('Cache-Control', 'max-age=900');
Web缓存是一个有点复杂的主题,一些非常不同的客户端解释加剧了这一问题。但一般来说,这将减轻web服务器上的负载,同时确保新内容在合理的时间范围内可用

我的理想情况是,人们不在客户端缓存html,而是将其留给Varnish

您想要的是varnish缓存资源并将其提供给客户端,并且仅在发生更改时生成新版本。最简单的方法是让varnish将其缓存很长一段时间,并在发生更改时使varnish中的条目无效(使用PURGE命令)

默认情况下,varnish将根据后端提供的头建立其缓存规则。因此,如果您的php代码生成了您描述的标题,那么默认的varnish vcl将相应地调整其缓存策略。但是,它只能以通用的、安全的方式执行此操作(例如,如果您使用cookie,它将永远不会缓存)。您知道后端是如何工作的,您应该更改varnish的缓存行为,而不是从后端发送不同的头,而是编写一个varnish.vcl文件。您应该告诉varnish将资源缓存很长一段时间,即使Max Age头的缓存控制丢失(在.vcl文件中设置TimeToLive ttl)。Varnish随后将为生成的条目提供服务,直到ttl通过或清除该条目


如果您已经做到了这一点,那么还有一个更高级的选项:在客户机上缓存资源,但让客户机在每次想要使用它时对其进行“重新验证”。浏览器通过HTTP GET plus头(您的响应应包括引发其行为的头)或头(您的响应应包括引发其行为的头)执行此操作。这节省了bandwith,因为varnish可以使用响应进行响应,而无需再次发送整个资源

将客户端缓存的标准HTTP头设置为您想要的任何内容。设置一个只有Varnish才能看到的自定义标题,例如
X-Varnish-TTL
,然后在VCL中,将以下代码合并到
VCL\u fetch
子文件中:

if (beresp.http.X-Varnish-TTL) {
    C{
        char *ttl;
        /* first char in third param is length of header plus colon in octal */
        ttl = VRT_GetHdr(sp, HDR_BERESP, "\016X-Varnish-TTL:");
        VRT_l_beresp_ttl(sp, atoi(ttl));
    }C
    unset beresp.http.X-Varnish-TTL;  // Remove so client never sees this
}