2011-02-17 11 views
1

ブラウザがサーバーからファイル(イメージ)の新しいバージョンを取得する方法がありますか(サーバーまたはクライアント側)ですか。問題の画像は、それ以外の場合は長時間キャッシュされます。私は、例えば、画像のURLに乱数を付加することができますが、これはこの状況では受け入れられません。 全く同じのURLから画像をリフレッシュする必要があります。イメージをリフレッシュするかキャッシュをクリアする

私がやっていること:ユーザーがビデオをアップロードするYouTubeのようなポータル。各ビデオには、ポータルのさまざまなページに表示されるサムネイルがあります。ユーザーはいつでもサムネイルを変更できます(サムネイルは3つのサムネイルから選択できます)。このような場合(新しい画像が「元の」画像を上書きする)、動画のサムネイルを更新して所有者(他のユーザーに古いサムネイルが表示されても気にしない)が新しいサムネイルを表示するようにしませんサムネイルが表示されます。

私はこれができないのではないかと心配していますが、私は確かにここに求めています。

更新:

example.jpg?refresh=yesplease 

あなたはまた、各訪問そのイメージをリフレッシュすることができます:私は、次のような、

+0

Expires:ヘッダーを過去に設定しますか? – Satya

+0

@Satyaクライアントはすでに画像がキャッシュされているため動作しません。また、再度チェックすることはありません。 –

答えて

4

あなたのサムネイルをETAGsを使用することができます。これにより、実際のサムネイルデータが変更されていない場合(つまり、まだ同じハッシュがある場合)、サムネイルデータの送信が防止されます。しかし、あなたはまだ、クライアントHTTP ETAGが変更されているかどうかを確認する要求に直面するだろう(normly HTTP 304

によって答えむしろ短い鮮度しきい値と組み合わされる(例えば数分)が、あなたはトレードオフを達成できますあなたは完全な新鮮さが必要な場合は、ETAGに固執する必要があるかもしれません。巧妙なハッシュ関数を作成すると、フロントエンドのロードバランサ(またはその近く)でETAGリクエストを処理できます。これはむしろ安いかもしれない

編集:。。私の他のコメントからの代替を追加

A別の答えで示唆されているようにリソースが変更されたときに再フェッチを強制するために、追加のリクエストパラメータを使用することもできます。 (多くのRailsアプリケーションで使用されている)そのスキーマのバリエーションは、最後の変更(または何らかの種類のハッシュ)のタイムスタンプをファイルに追加して、ファイルが実際に変更されたときにのみ変更されるようにすることです。このようなもの、または上記の方法の1つは、実際には常に最新のリソースを持つと同時に、不要なキャッシュ検証要求を実際には確実に持たない唯一の方法です。

+0

私が記述した場合にのみ絶対的な鮮度が必要です。私は、イメージが変わったことを知っていることが重要です(それで、私は手動でそれに取り組むことができました)。さもなければ、イメージはできるだけ長くキャッシュされるべきです(めったに変更されない、ほとんどの場合は変更されません)。つまり、できるだけETAGを避けたいのです(これらのチェック要求を避けるため)。 –

+0

問題は、何かが変更されたことをブラウザに絶対に伝えることができないことです。あなたはそれを求めるブラウザに頼らなければなりません。 HTTPにおけるこれらのキャッシュ無効化プロトコルの主なポイントは、主に適切なタイミングで(または少なくとも早期に)尋ねるようブラウザに指示することです。 –

+0

それは私が恐れていることです:\ –

-1

は、ファイル名の末尾にGETパラメータを追加し、サーバー側でのnginxとPHPを使用していますrand()パラメタを使用します。 PHPで :

example.jpg?refresh=<?php echo rand(1,999); ?> 
+0

質問をもう一度お読みください。私はこの「トリック」を知っており、それは受け入れられないと言いました。 –

+3

そのスキーマのバリエーション(多くのRailsアプリケーションで使用されています)は、最後の変更(または何らかの種類のハッシュ)のタイムスタンプをパラメータとしてファイルに追加して、ファイルが実際に変更されたときにのみ変更されます。このようなもの、または上記の方法の1つは、実際には常に最新のリソースを持つと同時に、不要なキャッシュ検証要求を実際には確実に持たない唯一の方法です。 –

+0

@Holgerちょうど私はこのコメントからあなたの提案を行っています。私はそれを受け入れることができるように答えとして投稿してください。 –

関連する問題