php内容从未被浏览器缓存?

时间:2016-02-14 11:51:54

标签: php caching mobile browser nginx

我为一个网站运行了一些测试,涉及动态内容(在这种情况下通过PHP / nginx)如何被各种浏览器缓存。

我得出结论,默认情况下,即使在移动浏览器中,即使在响应中没有Cache-Control也没有Expires参数,php文件永远不会从缓存中拉出来,即使我不发送POST请求,我只是按照页面的链接。它们总是重载。相比之下,css / js / image文件是从缓存中提取的。

这对我有好处,因为我希望动态html始终点击后端,并以Varnish或我自己的php /文件系统实现的形式提供缓存机制。

默认情况下这通常是预期的行为吗?我顺便使用会话cookie。

2 个答案:

答案 0 :(得分:3)

首先:我不是专家,你可以添加的内容比我现在做的更多,但它应该让你基本了解它是如何工作的。

CSS,图像和Javascript文件(通常)由网络服务器直接提供,无需点击任何PHP脚本。因此,Web服务器为这些文件处理缓存。

对于PHP内容,网络服务器会调用您的php脚本并返回状态代码200(如果没有错误,或者在脚本中没有明确指定)。

现在看到此链接:Caching Tutorial

它说:

  

如果响应中没有验证器(ETag或Last-Modified标头),并且它没有任何明确的新鲜度信息,通常会 - 但不总是 - 被认为是不可缓存的。

也就是说,网络服务器不会将这些标题添加到php响应中。但它会将它们添加到静态资源,如images,css,js。

因此,对于将来对您网站的请求,浏览器知道(因为这些标题)网站本身不可缓存,但图像是。

如果您第二次请求该网站,客户端通常会正常请求php脚本并再次获得正常响应,因为原始响应中没有包含缓存信息(这里没什么特别的)。

现在上面的文章说:

  

当缓存中存储了包含Last-Modified标头的表示时,它可以使用它来询问服务器自上次查看以来表示是否已更改,并使用If-Modified-Since请求。

所以基本上浏览器会询问网络服务器是否更改了图像,如果没有,服务器将返回“304 Not Modified”响应,而不将实际图像添加到响应中(< =这是缓存)

正如我之前所说,如果没有明确设置,php脚本永远不会返回此状态代码。 因此,在介绍了基础知识后,我们可以找到重要的部分:; - )

tl; dr或“如何缓存PHP页面”

您可能应该首先阅读上面文章“编写缓存感知脚本”一节。

然而,一个解决方案是:

  1. 在php脚本的响应中包含一些验证信息(例如“Last-Modified”标题)(使用header函数)
  2. 在脚本开头检查“If-Modified-Since”标头,并在适当的情况下返回状态代码“304 Not Modified”(不运行脚本的其余部分)。

答案 1 :(得分:1)

当重新请求先前没有ExpiresCache-Control标头返回的资源时,浏览器应该始终再次查询服务器,无论如何内容类型(毕竟,图像,CSS等也可以动态生成)。

唯一的区别是真正的静态文件通常带有额外的Last-Modified和/或Etag响应头,这允许浏览器缓存数据并使后续请求成为条件({{1和/或If-Modified-Since请求标头)。如果内容是新鲜的,则服务器返回没​​有内容的If-None-Match响应,并且浏览器从缓存中提取它。动态脚本的输出不会发生这种情况(好吧,不是默认情况下)。