簡體   English   中英

PHP會話修改的緩存控制頭?

[英]Cache-Control Header Modified By PHP Session?

我正在使用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 GMT
緩存控制
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-Robots-Tag中
NOINDEX
活着
超時= 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
接受
text / html的,應用/ XHTML + xml的,應用/ XML; Q = 0.9,* / *; Q = 0.8
接受語言
烯GB,EN; Q = 0.5
接受編碼
gzip的,放氣
接收字符
ISO-8859-1,utf-8; Q = 0.7,*; Q = 0.7
活着
300
連接
活着
引薦
HTTP://khall.####.###.######.com/
曲奇餅
PHPSESSID = abf5056e1289d3010448107632a1c1bd

如您所見,緩存控件被修改為包括:

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

我懷疑是在請求中發送會話cookie。 有沒有人知道發送我需要的標題的方法,但仍然在請求中保持會話? 我的應用程序通過引導程序運行,並使用Zend_Session處理會話。

任何幫助,將不勝感激。

您是正確的,假設此行為已連接到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 :不會發送標頭

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

私人的

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

從Zend_Controller文檔,第10.9 響應對象

setHeader($ name,$ value,$ replace = false)用於設置單個標頭。 默認情況下,它不會替換對象中同名的現有標頭; 但是,將$ replace設置為true將強制它這樣做。

你遇到的問題是你的max-age = 3600被附加到緩存控制頭,而不是替換它。 嘗試將$ replace參數設置為true

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM