代码之家  ›  专栏  ›  技术社区  ›  Kieran Hall

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

  •  11
  • Kieran Hall  · 技术社区  · 17 年前

    我正在使用 Zend_Controller_Response 对象。我打算将缓存应用于图像,但是由于某些原因导致缓存控制头被覆盖。

    我的代码如下:

    $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
    最后修改
    十二亿三千四百八十七万二千五百一十四
    埃塔格
    d3ef646c640b689b0101f3e03e08a524
    内容长度
    一千四百五十二
    X-UA兼容
    IE=仿真器7
    X-Roopts标签
    无索引
    保持活力
    超时=15,最大=100
    连接
    保持活力
    内容类型
    图像/JPEG

    请求报头

    宿主
    卡哈尔。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
    接受
    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
    接受语言
    EN,EN;Q=0.5
    接受编码
    放气
    接受字符集
    ISO-8859-1,UTF-8;Q=0.7,*;Q=0.7
    保持活力
    三百
    连接
    保持活力
    引用者
    http://khall.com/
    曲奇饼干
    phpsessid=abf5056e1289d310448107632a1c1bd

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

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

    我怀疑请求中发送的会话cookie。有人知道如何发送我需要的头,但仍将会话保留在请求中吗?我的应用程序是通过引导程序运行的,会话是使用zend_会话处理的。

    任何帮助都将不胜感激。

    2 回复  |  直到 14 年前
        1
  •  13
  •   karim79    17 年前

    来自Zend_控制器文档,部分 10.9. The Response Object

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

    您遇到的问题是,您的max age=3600正在附加到缓存控制头,而不是替换它。尝试设置 美元替换 参数到 .

        2
  •  27
  •   Stefan Gehrig    17 年前

    假设这种行为与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_限制器 每次请求时使用 session_cache_limiter()
    3. 覆盖整个 缓存控制 -控制器中带有指定字符串的头

    的可能值 session.cache_限制器 会话缓存限制器() 是:

    没有人 :不发送标题

    无超高速缓冲存储器 :

    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
    

    私人\不\到期 :

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

    公众的 :

    Expires: pageload + 3 hours
    Cache-Control: public, max-age=10800
    
    推荐文章