2009-03-25 20 views
10

Zend_Controller_Responseオブジェクトを使用してブラウザに画像を出力しています。イメージにキャッシュを適用することは私の意図ですが、何かがCache-Controlヘッダーを上書きする原因になります。次のようにPHPセッションによって変更されたキャッシュ制御ヘッダー?

私のコードは次のとおりです。

$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の中で見て)です:

レスポンスヘッダ

水曜日、3月25日2009 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
無店舗、キャッシュなし、しなければならない - 再検証、ポストチェック= 0、事前にチェック= 0、最大エージング= 3600
のLast-Modified
たEtag
d3ef646c640b689b​​0101f3e03e08a524
のContent-Length
X-UA互換
IE = EmulateIE7
X-ロボットタグ
にnoindex
キープアライブ
タイムアウト= 15、最大= 100
接続
キープAlive
コンテンツタイプ
image/jpeg

リクエストヘッダ

ホスト
khall。####。###。######。com
のUser-Agent
のMozilla/5.0 (X11; U; Linux i686; en-US; RV:1.9.0.7)のGecko/2009030422のUbuntu/8.04(ハーディ)のFirefox/3.0 0.7
text/htmlで、アプリケーション/ XHTML + xmlの、アプリケーション/ XMLを受け入れる; Q = 0.9、*/*; qは= 0.8
受け入れ言語
EN-JP、EN; Q = 0.5
受け入れエンコード
GZIP、収縮
受け入れ、文字セット
ISO-8859-1、UTF-8、Q = 0.7、*; q = 0である。7
キープアライブ
接続
キープアライブ
リファラー
のhttp://khall.####.###.######.com/
あなたが見ることができるように、キャッシュ制御を含むように変更され
PHPSESSID = abf5056e1289d3010448107632a1c1bd

クッキー:

無店舗、キャッシュなし、-再検証する必要があり、ポストチェック= 0、事前にチェック= 0

私の疑惑は、要求で送信されているセッションクッキーに向かっています。誰も私が必要とするヘッダーを送信する方法を知っていますが、まだ要求にセッションを維持していますか?私のアプリケーションはブートストラップを通して実行され、セッションはZend_Sessionを使って処理されます。

ご協力いただければ幸いです。 Zend_Controllerのドキュメントから

答えて

13

、セクション10.9. The Response Object

のsetHeader個々 ヘッダを設定するために使用されている($名、$値、$ = 偽を置き換えます)。デフォルトでは、 はオブジェクト内の同じ という名前の既存のヘッダーを置き換えません。ただし、 $をtrueに設定すると、強制的に となります。

問題は、max-age = 3600がキャッシュコントロールヘッダーに追加されていることです。 $ replaceパラメータを,に設定してみてください。

+0

GAH!私は自分の顔を叩かなければならない。私はそのパラメータを渡していると思った!あなたはかなり正しいです、それは答えです。 –

+0

Hehe、私はいつもそれをやる!証明? http://stackoverflow.com/questions/657600/how-do-i-correctly-create-a-zend-feedを参照してください – karim79

26

この動作がPHPのセッションメカニズムに接続されていることを前提としています。応答と共に送信されるキャッシュHTTPヘッダーを制御する構成設定session.cache_limiterがあります。ここでのデフォルト設定は、あなたが(あなただけのmax-age=3600がここに設定を追加)Cache-Control -header以外に、あなたのコントローラ内でこれらのヘッダの全てを上書き

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 

を送信nocacheです。

可能な解決策は、次のとおり

  1. は、例えばするPHP構成(session.cache_limiter)を変更しますnone - これは、他のPHPアプリケーション
  2. に問題を引き起こす可能性がsession_cache_limiter()
  3. 指定された文字列

session.cache_limiterのための可能な値を使用して、コントローラにフルCache-Control -headerを上書きを使用して、各要求にsession.cache_limiterを設定し、 session_cache_limiter()はない:

いずれ:NOヘッダが送信されません

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 
+0

あなたの返事をありがとう。問題は私の急いでのコーディングでした.karim79が指摘したように、問題はより多くのZend Frameworkベースです。しかし、洞察に感謝します。 –

+0

ニース、これは私の質問を解決しました:http://stackoverflow.com/questions/1937581/php-remove-http-header –

関連する問題