我有一个系统,在网站上有两层缓存。每个请求都会检查web服务器上的缓存,如果找到已缓存的生成页面,则会返回缓存,而不是再次生成。
例如:
- 用户A访问网站URL
http://www.example.com/home/
- 服务器找不到缓存
- 服务器生成页面
- 服务器将页面写入缓存
- 服务器将生成的页面返回给用户A
- 用户A很高兴
和
- 用户B访问网站URL
http://www.example.com/home/
- 服务器找到缓存
- 服务器返回缓存,而不是再次生成页面
- 用户B很高兴
所有这些都毫无问题。但我也想添加一个选项,即浏览器不会再次ping服务器(节省服务器检查缓存是否存在的时间),而是使用自己的缓存。
- 用户A再次访问URL
http://www.example.com/home/
- 浏览器缓存中有该页面
- 浏览器从缓存中为用户加载页面
我不能让后者工作。在原始页面生成过程中,我会将以下标题与页面一起发送给用户:
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();
然后您可以根据提供的内容编写自己的标题