浏览器不监听PHP发送的缓存头,什么可以更改


Browser does not listen to headers sent by PHP for cache, what can be changed?

我有一个系统,在网站上有两层缓存。每个请求都会检查web服务器上的缓存,如果找到已缓存的生成页面,则会返回缓存,而不是再次生成。

例如:

  1. 用户A访问网站URL http://www.example.com/home/
  2. 服务器找不到缓存
  3. 服务器生成页面
  4. 服务器将页面写入缓存
  5. 服务器将生成的页面返回给用户A
  6. 用户A很高兴

  1. 用户B访问网站URL http://www.example.com/home/
  2. 服务器找到缓存
  3. 服务器返回缓存,而不是再次生成页面
  4. 用户B很高兴

所有这些都毫无问题。但我也想添加一个选项,即浏览器不会再次ping服务器(节省服务器检查缓存是否存在的时间),而是使用自己的缓存。

  1. 用户A再次访问URL http://www.example.com/home/
  2. 浏览器缓存中有该页面
  3. 浏览器从缓存中为用户加载页面

我不能让后者工作。在原始页面生成过程中,我会将以下标题与页面一起发送给用户:

header('Cache-Control: public, max-age=10000, must-revalidate');
header('Expires: Fri, 03 Feb 2012 01:59:45 GMT');

但当我用Firebug或Chrome开发工具检查它时,它并没有说它正在使用缓存,而是再次从服务器上询问数据。我知道我一定做错了什么,因为我为Javascript这样的静态文件设置了同样的东西,这很有效。

为了测试这一点,我不仅尝试重新加载页面,我还在网站上创建了链接,并在每次从服务器请求页面的链接之间移动。

我是不是错过了什么?

编辑:

好吧,很明显,服务器每次都会自动发送"Pragma:无缓存"。有人知道服务器为什么要这么做吗?这使浏览器无法使用缓存。

如果为该页面/url启用了会话,则Pragma: no-cache-标头将添加到http标头中,从而阻止浏览器使用缓存。

如果使用session_startPHP将添加

Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0

PHP的全部目的是提供动态页面。

阻止这一切。。。

session_cache_limiter(''); 
session_start();

然后您可以根据提供的内容编写自己的标题