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

时间:2012-01-30 14:52:13

标签: php caching browser header http-headers

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

例如:

  1. 用户A访问网站网址http://www.example.com/home/
  2. 服务器找不到缓存
  3. 服务器生成页面
  4. 服务器将页面写入缓存
  5. 服务器将生成的页面返回给用户A
  6. 用户A很高兴
    1. 用户B访问网站网址http://www.example.com/home/
    2. 服务器找到缓存
    3. 服务器返回缓存而不是再次生成页面
    4. 用户B很高兴
    5. 所有这一切都没有问题。但我还想添加一个浏览器不会再次ping服务器的选项(节省服务器检查缓存是否存在的时间)并改为使用自己的缓存。

      1. 用户A再次访问网址http://www.example.com/home/
      2. 浏览器在缓存中有该页面
      3. 浏览器从缓存中加载用户的页面
      4. 我不能让后者工作。在原始页面生成期间,我向页面用户发送以下标题:

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

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

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

        我错过了什么吗?

        修改

        好吧,显然发生的事情是服务器每次都自动发送“Pragma:no-cache”。有谁知道为什么服务器会这样做?这使浏览器无法使用缓存。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

如果您使用session_start PHP将添加

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();

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