PHP会话修改的缓存控制头?

时间:2009-03-25 11:09:17

标签: php zend-framework caching

我正在使用Zend_Controller_Response对象将图像输出到浏览器。我打算对图像应用缓存,但是有些东西会导致Cache-Control标头被覆盖。

我的代码如下:

$this->getResponse()
    ->setHeader('Last-Modified', $modifiedTime, true)
    ->setHeader('ETag', md5($modifiedTime), true)
    ->setHeader('Expires', $expires, true)
    ->setHeader('Pragma', '', true)
    ->setHeader('Cache-Control', 'max-age=3600')
    ->setHeader('Content-Type', $mimeType, true)
    ->setHeader('Content-Length', $size, true)
    ->setBody($data);

输出(在Firebug中查看)是:

响应标题

日期
星期三,2009年3月25日10:34:40 GMT
服务器
Apache / 2.2.3(Ubuntu)mod_ssl / 2.2.3 OpenSSL / 0.9.8c
过期
星期四,2009年3月26日10:34:41 GMT
Cache-Control
no-store,no-cache,must-revalidate,post-check = 0,pre-check = 0,max-age = 3600
上次修改
1234872514
的Etag
d3ef646c640b689b​​0101f3e03e08a524
内容长度
1452
X-UA-兼容
IE = EmulateIE7
X-机器人 - 标记
NOINDEX
Keep-Alive
timeout = 15,max = 100
连接
保持活动
内容类型
图像/ JPEG

请求标题

主机
khall。####。###。######。com
User-Agent
Mozilla / 5.0(X11; U; Linux i686; en-US; rv:1.9.0.7)Gecko / 2009030422 Ubuntu / 8.04(hardy)Firefox / 3.0 0.7
接受
的text / html,应用/ XHTML + xml的,应用/ XML; Q = 0.9,* / *; Q = 0.8
接受语言
EN-GB,连接; Q = 0.5
接受编码
gzip的,放气
接收字符集
ISO-8859-1,utf-8; Q = 0.7,*; Q = 0.7
保持活动
300
连接
保活
Referer的
HTTP://khall.####.###.######.com/
曲奇
PHPSESSID = abf5056e1289d3010448107632a1c1bd

如您所见,缓存控件已修改为包括:

  

no-store,no-cache,must-revalidate,post-check = 0,pre-check = 0

我怀疑是在请求中发送的会话cookie。有没有人知道发送我需要的标题的方法,但仍然在请求中保持会话?我的应用程序通过引导程序运行,会话使用Zend_Session处理。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:27)

您认为此行为与PHP中的会话机制相关联是正确的。配置设置session.cache_limiter控制将随响应一起发送的缓存HTTP标头。此处的默认设置为nocache,发送

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

除了Cache-Control - 标题之外,您还会覆盖控制器中的所有这些标题(您只需在此处添加max-age=3600设置)。

可能的解决方案是:

  1. 将PHP配置(session.cache_limiter)更改为例如none - 但这可能会给其他PHP应用程序带来问题
  2. 使用session_cache_limiter()
  3. 为每个请求设置session.cache_limiter
  4. 使用指定的字符串
  5. 覆盖控制器中的完整Cache-Control - 标头

    session.cache_limitersession_cache_limiter()的可能值为:

    :不会发送标头

    <强>非缓存

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

    <强>私有

    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: private, max-age=10800, pre-check=10800
    

    <强> private_no_expire

    Cache-Control: private, max-age=10800, pre-check=10800
    

    公开

    Expires: pageload + 3 hours
    Cache-Control: public, max-age=10800
    

答案 1 :(得分:13)

从Zend_Controller文档中,10.9. The Response Object

部分
  

setHeader($ name,$ value,$ replace =   false)用于设置个人   头。默认情况下,它没有   替换相同的现有标头   对象中的名称;但是,设定   $ replace to true将强制它执行   如此。

您遇到的问题是您的max-age = 3600被附加到缓存控制标头,而不是替换它。尝试将 $ replace 参数设置为 true