[php]
関数 downloadFile( $fullPath ){
// 新たなスタートでなければなりません
if( headers_sent() ) // ヘッダーが送信されたかどうかを確認します
Die('ヘッダー送信') // exit() と同等
// 一部のブラウザでは必須です
if(ini_get('zlib.output_compression')) //構成オプションの値を取得します
ini_set('zlib.output_compression', 'Off'); //このモジュールにより、PHP は gzip (.gz) 圧縮ファイルを透過的に読み書きできるようになります
// ファイルは存在しますか?
if( file_exists($fullPath) ){
// 情報を解析する / 拡張機能を取得する
$fsize = ファイルサイズ($fullPath);
$path_parts = pathinfo($fullPath);// ファイルパス情報を返す
/*
$path_parts = pathinfo("/www/htdocs/index.html");
echo $path_parts["dirname"] . "n";
echo $path_parts["basename"] . "n";
Echo $path_parts["extension"] . "n";// サフィックス名
返される情報は次のとおりです:
/www/htdocs
インデックス.html
html
*/
$ext = strto lower($path_parts["extension"]) //文字列を小文字に変換します
// コンテンツタイプを決定します
スイッチ ($ext) {
ケース "pdf": $ctype="アプリケーション/pdf";
ケース "exe": $ctype="アプリケーション/オクテットストリーム";
ケース "zip": $ctype="アプリケーション/zip";
ケース "doc": $ctype="アプリケーション/msword";
ケース "xls": $ctype="application/vnd.ms-excel";
ケース "ppt": $ctype="application/vnd.ms-powerpoint";
ケース "gif": $ctype="image/gif";
ケース "png": $ctype="image/png";
ケース「jpeg」:
ケース "jpg": $ctype="image/jpg";
デフォルト: $ctype="application/force-download";
}
header("Pragma: public"); // 必須は、応答を任意のキャッシュに保存できることを示します
/*
「Cache-Control: public」と同じ
パブリック: 応答が通常キャッシュ可能ではないか、非共有キャッシュでのみキャッシュ可能である場合でも、応答を任意のキャッシュで保存できることを示します。
プライベート: 応答メッセージの一部またはすべての部分が 1 人のユーザー向けであり、共有キャッシュに保存してはならないことを示します。ソースサービスを利用できます
サーバーは、応答の特定の部分が特定のユーザーに固有であり、他のユーザーからのリクエストには無効であることを宣言できます。プライベートなもの
(非共有) キャッシュは、この応答をキャッシュできます。
No-cache: no-cache キャッシュ制御ディレクティブでフィールド名が指定されていない場合、キャッシュはこの応答を使用できません。
後続のリクエストは、ソース サーバーによって正常に再検証された場合にのみ満たされます。これにより、オリジンサーバーが呼び出し音を防ぐことができます
キャッシュがクライアントに古い応答を返すように構成されている場合でも、キャッシュする必要があります。
no-cache キャッシュ制御ディレクティブで 1 つ以上のフィールド名が指定されている場合、キャッシュはこの応答を使用して
を満たすことができます。
後続のリクエスト。ただし、これはキャッシュに関する他の制限に限定されます。ただし、指定したファイル名を後でリクエストすることはできません
応答がオリジンサーバーによって正常に再検証されなかった場合に、要求に応答して送信されます。これにより、オリジンサーバーは
を防ぐことができます
キャッシュ重複排除では、応答内の特定のヘッダー フィールドが使用されますが、キャッシュは応答の残りの部分を保存できます。
/*
Pragma ヘッダーは、プロキシおよびゲートウェイ システムのディレクティブを指定します。
クライアントとサーバーの間には多くのプロキシ システムが存在する可能性があるため、Pragma
Pragma ヘッダーが
に到達すると、ヘッダーは各プロキシを通過する必要があります。
サーバー、ヘッダーはサーバー ソフトウェアによって無視される可能性があります。
HTTP/1.0で定義されている唯一のディレクティブはno-cacheディレクティブです
。
リクエストされた
についてサーバーに接続するようにキャッシュ プロキシに指示するために使用されます。
これにより、クライアントはローカル キャッシュを使用する代わりに
を行うことができます。
元の Web サーバーから最新のドキュメントをリクエストします
中間プロキシサーバーからキャッシュされたコピーを受信しません。
Pragma ヘッダーは HTTP 1.0 の機能であり、HTTP 1.1 で維持されます
下位互換性のため、
では新しい Pragma ディレクティブは定義されません。
未来
*/
header("有効期限: 0");
/*
Expires エンティティ ヘッダー フィールド (エンティティ ヘッダー) は、応答が古いとみなされるまでの時間を示します。古いキャッシュアイテム
このキャッシュ項目がソースサーバーによるものでない限り、キャッシュできません (エージェントまたはユーザーエージェントのバッファー) がクライアントに返されます
(またはエンティティの新しいコピーを保持する中間キャッシュによって) 検証されます。
0 はすぐに期限切れになり、キャッシュしないことを意味します。
*/
header("キャッシュ制御: 再検証が必要、事後チェック = 0、事前チェック = 0");
/*
事後チェックと事前チェックのキャッシュ制御ディレクティブは一緒に指定する必要があります
ペアの場合、それ以外の場合は無視されます。
header("Cache-Control: private",false); // ブラウザーの特定の場合に必要です
header("コンテンツタイプ: $ctype");
header("Content-Disposition:attachment; filename="".basename($fullPath)."";" );
header("コンテンツ転送エンコーディング: バイナリ");
header("Content-Length: ".$fsize);
Ob_clean(); //出力バッファをクリーン(消去)します
Flush(); //PHP が実行される環境 (CGI、Web サーバーなど) に関係なく、PHP プログラムのバッファを更新します。この関数は、これまでのプログラムの出力をすべてユーザーのブラウザに送信します。
Readfile($fullPath); // ファイルを読み取り、出力バッファに書き込みます。
}その他
Die('ファイルが見つかりません');
}
?>
これはPHPマニュアルのサンプルコードです。わからない場合は一つずつ翻訳していきます。
以下は
© kekehu / 技術リソース / 2009.02.17 / 10:15 / 4246PV
Web ページのキャッシュは、HTTP メッセージ ヘッダーの「Cache-control」によって制御されます。一般的な値には、private、no-cache、max-age、must-revalidate などが含まれます。デフォルトは private です。その機能は、さまざまな再閲覧方法に応じて次の状況に分類されます:
値はプライベート、キャッシュなし、必須再検証の場合、新しいウィンドウが開かれたときにサーバーに再度アクセスします。
また、max-age 値が指定されている場合、この値の範囲内ではサーバーに再度アクセスすることはありません。例:キャッシュ制御: max-age=5 (5 秒以内にこの Web ページに再度アクセスすると、サーバーにアクセスしないことを意味します)
(2)アドレスバーに入力
値がプライベートまたは再検証が必要な場合、サーバーには初めてアクセスされるだけで、再度アクセスされることはありません。
値がキャッシュなしの場合、毎回アクセスされます。
値が max-age の場合、有効期限が切れる前に再度アクセスすることはできません。
(3)戻るボタンを押します
値が private、must-revalidate、max-age の場合、再度アクセスされることはありません。
値が no-cache の場合、毎回アクセスが繰り返されます
(4) 更新ボタンを押します
価値に関係なく、繰り返しアクセスされます
キャッシュ制御値が「no-cache」の場合、このページにアクセスしても、インターネットの一時記事フォルダーにページのバックアップは残りません。
さらに、「Expires」値を指定するとキャッシュにも影響します。たとえば、[Expires] の値が長期間経過した時間として指定されている場合、この Web サイトにアクセスするときにアドレス バーで Enter キーを繰り返し押すと、アクセスは毎回繰り返されます: Expires: Fri, 31 Dec 1999 16:00 :00GMT
例: IE でのページ キャッシュの無効化
http 応答メッセージのヘッダー設定:
CacheControl = キャッシュなし
プラグマ=キャッシュなし
有効期限 = -1
サーバー上の Web ページが頻繁に変更される場合は、有効期限を -1 に設定します。これは、すぐに有効期限が切れることを意味します。 Web ページが毎日午前 1 時に更新される場合、有効期限を翌日の午前 1 時に設定できます。
HTTP1.1 サーバーが CacheControl = no-cache を指定すると、ブラウザーは Web ページをキャッシュしません。
古い HTTP 1.0 サーバーは Cache-Control ヘッダーを使用できません。
したがって、HTTP 1.0 サーバーとの下位互換性のために、IE は Pragma:no-cache ヘッダーを使用して HTTP に対する特別なサポートを提供します。
クライアントが安全な接続 (https://) 経由でサーバーと通信し、サーバーが応答で Pragma:no-cache ヘッダーを返す場合、
その場合、Internet Explorer はこの応答をキャッシュしません。注: Pragma:no-cache は、安全な接続で使用される場合にのみキャッシュを防止します。安全でないページで使用された場合、処理は Expires:-1 と同じになりますが、ページはすぐに期限切れとしてマークされます。
著者:wolinxuebin