web-dev-qa-db-ja.com

応答ヘッダーに「Pragma:no-cache」を追加するとどうなるでしょうか。 (Apache、PHP)

メンテナンスを継承したウェブサイトがありますが、これは大きな混乱です。
私がしていることの1つは、パフォーマンスの向上です。特に、画像にExpiresヘッダーを追加しています。

現在、PHPファイルを介して提供される画像がいくつかあり、それらにはExpiresヘッダーがありますが、毎回読み込まれます。

応答ヘッダーを見ると、次のことがわかります。

Expires Wed, 15 Jun 2011 18:11:55 GMT
Cache-Control   no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma  no-cache

これは明らかに問題を説明しています。

今、私はコードベース全体を見てきましたが、どこにも「プラグマ」とは書かれていません。 .htaccessにも関連するものはないようです。

それらの「プラグマ」(および「キャッシュ制御」)ヘッダーを設定する可能性のあるアイデアはありますか?また、どうすればそれを回避できますか?

30
Daniel Magliola

PHPライブラリを含まないが、PHPファイルを介して画像を提供するファイルと同じフォルダーにある単純なファイルを作成します。

file: test.php

ブラウザからこのファイルをリクエストし、ヘッダーを確認してください。不要なResponseヘッダーが表示された場合は、Apacheを介して構成されており、PHPファイルを介して生成されていないことがわかります。検索は、の.htaccessファイルに集中できます。ディレクトリツリー、およびhttp.confgおよびその他の含まれているApache構成ファイルで検索する必要があります

<Directory....

そして

<VirtualHost

あなたのサイトに適用されるかもしれないセクション。

その単純なPHPファイルのリクエストにヘッダーが表示されない場合は、PHPがヘッダーをどこかに設定していることがわかります。画像提供ファイル(または画像をエコーし​​て終了した直後)、ただし次のPHPスニペット)

var_dump(get_included_files());

画像提供URLを介して画像をリクエストします。上記のスニペットは、リクエストで使用されたすべてのPHPファイルを出力します(ブラウザが無効な画像を報告するため、ソースを表示するか、curlを使用して生の出力を表示する必要があります)。 )

作業ファイルにファイルのサブセットを用意し、それらを検索して、

header();

関数。 header関数は、生のPHPコードが応答ヘッダーを設定できる唯一の方法だと思います)。また、検索することもできます。

call_user_func
eval
$$

pHPのメタプログラミング機能を使用してheader関数を呼び出す動的コードがページにある場合。

幸運を!

10
Alan Storm

犯人はphp.iniである可能性があり、session.cache_limiter = nocacheです。アンチキャッシングヘッダーを回避するには、値を空白またはパブリックに変更します。

27
technomage

_Pragma: nocache_でも同様の問題が発生しました

session_cache_limiter(false);の前のsession_start();はそれを抑制しているようでした。

11
Mahks

.htaccessのヘッダーの設定を解除してみてください。以下の例では、拡張子icojpegpnggifjscss

<FilesMatch "\.(ico|jpeg|png|gif|js|css)$">
    Header unset Cache-Control
    Header unset Pragma
</FilesMatch>

この記事 にいくつかのヒントがあります。

7
BalusC

私はこれを実行時にこれで行いました:

header("Pragma:");

これにより、スクリプトはプラグマヘッダーの設定を解除しました。

4
Michael Butler

.htaccessにない場合は、メインのApache構成ファイルにあるか、セットアップに応じてそのインクルードの1つにある可能性があります。

1
Colonel Sponsz

同様の問題を抱えている人々にとって、多くのフレームワークがヘッダー、特にキャッシュヘッダーを自動追加することは注目に値します。フレームワークライブラリまたはアプリ内でそれらをオーバーロードするのはかなり簡単です。

0
twunde