我为一个网站运行了一些测试,涉及动态内容(在这种情况下通过PHP / nginx)如何被各种浏览器缓存。
我得出结论,默认情况下,即使在移动浏览器中,即使在响应中没有Cache-Control
也没有Expires
参数,php文件永远不会从缓存中拉出来,即使我不发送POST请求,我只是按照页面的链接。它们总是重载。相比之下,css / js / image文件是从缓存中提取的。
这对我有好处,因为我希望动态html始终点击后端,并以Varnish或我自己的php /文件系统实现的形式提供缓存机制。
默认情况下这通常是预期的行为吗?我顺便使用会话cookie。
答案 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 :(得分:1)
当重新请求先前没有Expires
或Cache-Control
标头返回的资源时,浏览器应该始终再次查询服务器,无论如何内容类型(毕竟,图像,CSS等也可以动态生成)。
唯一的区别是真正的静态文件通常带有额外的Last-Modified
和/或Etag
响应头,这允许浏览器缓存数据并使后续请求成为条件({{1和/或If-Modified-Since
请求标头)。如果内容是新鲜的,则服务器返回没有内容的If-None-Match
响应,并且浏览器从缓存中提取它。动态脚本的输出不会发生这种情况(好吧,不是默认情况下)。