2012-03-23 9 views
1

私はApacheを使用しています。初めて直接イメージをリクエストすると、イメージのステータスは「200 OK」になります。後続の要求のステータスは「304 Not Modified」となり、クライアントとサーバーの両方の帯域幅が節約されるため、良好です。PHP:ウェブルートとキャッシング外のストリーミングイメージ

私はユーザーが画像をアップロードできるウェブサイトに取り組んでいます。これらのイメージは、ホットリンクを防ぐだけでなく、イメージ上の統計情報を収集できるように、Webrootの外部に格納する必要があります。だから私の考えは、画像をストリーミングするために、次のようにPHPスクリプトを使用していた:

<?php 

    $image_to_stream = '/path/outside/of/webroot/image.jpg'; 
    $cache_seconds = 2592000; // 30 days 

    header("Cache-Control: max-age=$cache_seconds"); 
    header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache_seconds) . ' GMT'); 
    header('Pragma: cache'); 
    header('Content-Type: image/jpg'); 
    header('Content-length: ' . filesize($image_to_stream)); 

    readfile($image_to_stream); 

?> 

しかし、スクリプトは常に「OK 200」のステータスを持っているように見えますし、画像全体がストリーミングされます。これを修正する方法はありますか、別のアプローチをとっているのでしょうか?ありがとう!

答えて

0

If-Modified-Sinceリクエストヘッダーを処理する必要があります。

基本的に、そのファイルのタイムスタンプをローカルで確認してください。 If-Modified-Sinceヘッダーに指定された日付以降に変更された場合は、返却してください。それ以外の場合は、変更されていない304 bacを送信します。 RFCから

もし修飾-ので、ヘッダとGETメソッドと、それはIF-によって与えられた日付以降に変更された場合にのみ、識別されたエンティティを転送することがないRangeヘッダ要求Modified-Sinceヘッダー。これは、以下の例が含まれて決定するためのアルゴリズム:

a)の要求が正常に 200(OK)の状態よりも、または渡された場合 - 変更 - ので、日付が 無効である、応答があれば、他の何になりたい場合通常のGETとまったく同じです。 サーバーの現在時刻より後の日付が無効です。 です。

b)If-Modified-Since の日付以降にバリアントが変更されている場合、応答は通常のGETとまったく同じです。

c)有効なIf- Modified-Sinceの日付以降にバリアントが変更されていない場合、サーバーは304(Not Modified)応答を返すべきです(SHOULD)。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

あなたはこのPHPコードでそれを送ることができます働い

header('HTTP/1.1 304 Not Modified', true, 304); 
+0

を!どうもありがとうございました! – Nick

+1

しかし、帯域幅を節約したい場合は、新しいCache-control/expiresヘッダーを忘れずに* * – symcbean

+0

@symcbean、合意してください! – Brad

関連する問題