【问题标题】:Cache-Control Header Modified By PHP Session?PHP会话修改的缓存控制标头?
【发布时间】:2009-03-25 11:09:16
【问题描述】:

我正在使用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
服务器
Apache/2.2.3 (Ubuntu) mod_ssl/2.2.3 OpenSSL/0.9.8c
过期
格林威治标准时间 2009 年 3 月 26 日星期四 10:34:41
缓存控制
无存储、无缓存、必须重新验证、后检查=0、预检查=0、最大年龄=3600
最后修改
1234872514
标签
d3ef646c640b689b​​0101f3e03e08a524
内容长度
1452
X-UA 兼容
IE=EmulateIE7
X 机器人标签
无索引
保持活跃
超时=15,最大值=100
连接
保持活跃
内容类型
图片/JPEG

请求标头

主机
khall.####.###.######.com
用户代理
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.7) Gecko/2009030422 Ubuntu/8.04 (hardy) Firefox/3.0 .7
接受
文本/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
接受语言
en-gb,en;q=0.5
接受编码
gzip,放气
接受字符集
ISO-8859-1,utf-8;q=0.7,*;q=0.7
保持活跃
300
连接
保持活力
推荐人
http://khall.####.###.######.com/
饼干
PHPSESSID=abf5056e1289d3010448107632a1c1bd

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

无存储、无缓存、必须重新验证、后检查=0、预检查=0

我怀疑是在请求中发送的会话 cookie。有谁知道发送我需要的标头的方法,但仍将会话保留在请求中?我的应用程序通过引导程序运行,并且使用 Zend_Session 处理会话。

任何帮助将不胜感激。

【问题讨论】:

    标签: php zend-framework caching


    【解决方案1】:

    假设此行为与 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-header(您只在此处附加您的max-age=3600 设置)之外,您还可以覆盖控制器中的所有这些标头。

    可能的解决方案是:

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

    session.cache_limitersession_cache_limiter() 的可能值为:

    none:不发送标头

    无缓存

    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
    

    【讨论】:

    【解决方案2】:

    来自 Zend_Controller 文档,10.9. The Response Object 部分

    setHeader($name, $value, $replace = false) 用于设置个人 标题。默认情况下,它不 替换相同的现有标题 对象中的名称;然而,设置 $replace 为 true 将强制它执行 所以。

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

    【讨论】:

    • 嘎!我应该打自己的脸。我以为我在传递那个参数!不过你说的很对,这就是答案。
    • 呵呵,我一直在做!证明?见stackoverflow.com/questions/657600/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-13
    • 2016-04-15
    • 2010-10-31
    • 1970-01-01
    • 2017-01-10
    • 2011-10-28
    相关资源
    最近更新 更多