1

私のウェブサイトには、年に 1 回更新される Google マップのオーバーレイ画像がいくつかあります。したがって、これらはブラウザ キャッシングの候補です。

キャッシュを指定する最良の方法は何ですか? たとえば、私が使用する場合...

Header set Cache-Control "max-age=31536000, public"

(31536000 秒 = 1 年)

私が理解している限りでは、私が画像を更新する前に誰かが Web サイトにアクセスした場合、正しい新しい画像が表示されるまでに 1 年待たなければならないので、これは役に立ちませんか? 期間ではなく、イメージの有効期限が切れる日付を指定できますか? または、これを処理するより良い方法はありますか?

また、正規表現が機能しないようです。私の .htaccess ファイル内のこのコードの何が問題なのか誰にもわかりますか (特定のディレクトリ内のすべての .PNG 画像を一致させたい) ...

<FilesMatch "\/overlayDirectoty\/[^\.]+\.png$">
Header set Cache-Control "max-age=31536000, public"
</FilesMatch>

私は共有 Linux/Apache ホスティング (goDaddy) を使用しています。

アップデート

画像ファイルの平均サイズは 580 バイトです。ただし、ユーザーがマップをパンおよびズームすると、多くのものがダウンロードされます (合計で 12000 個あります)。

アップデート

私はちょうどこれを発見しました。早ければ毎年 1 月 1 日にイメージを更新することがわかっている場合、これは機能しますか? ...

Header set Expires "Sun, 1 Jan 2014 00:00:00 GMT"

4

3 に答える 3

1

この場合、イメージの有効期限が切れないように設定しますが、変更するときは別のファイル名を使用します。

于 2013-05-10T19:04:30.767 に答える
0

最初に、etag を使用した再検証を利用するかどうかを検討する必要があります。

http://en.wikipedia.org/wiki/HTTP_ETag

ブラウザーにイメージ全体をキャッシュさせるか、クライアントに、etag がまだ同じかどうかを検証するためだけに使用される head 要求を実行させることができます。e タグは、ファイルの変更時間、名前、およびサイズを使用して、Apache によってオンザフライで計算されます。

つまり、画像が変更されると、その e-tag が変更されます。

e-tag が変更されない場合、クライアントは cacehd バージョンを使用し、ファイルをダウンロードしません。

ただし、 head リクエストのオーバーヘッドは最小限であり、このアプローチをお勧めします。

それにもかかわらず、完全を期すために、他の可能性について議論しましょう。

  • ファイル名を変更する

ファイル名が変更されると、ブラウザはファイルを再取得します。一般的な方法は、いわゆる「キャッシュブレーカー」をクエリ文字列としてファイルに追加することです。php で src URL を生成する場合は、変更タイムスタンプのようなものを追加するだけで、URL は次のようになります。

image.jpg?UNIX_TIMESTAMP

  • 選択した時点で有効期限が切れるキャッシュ ルールを使用する

画像を更新するときに自分自身を釘付けにし、以前はできなかったため、これを維持するのは良くないと思います。ただし、ファイル名の変更は常に「最後の手段」の手段として残ります。

スクリプト言語を使用してヘッダーを動的に設定し、計算することもできますが、これは Web サーバーを使用して配信するほどパフォーマンスが高くありません。mod_xsendfile のような組み合わせもありますが、それはあなたの要求に対して絶対にやり過ぎです。

いいえ、あなたは全体像を見ていないと思います。

mod_expires を使用すると、現在の時間 (アクセス) またはファイルの変更を参照して、キャッシュの有効期間を指定できます。ファイルの変更時刻が正しいことを確認したら、それを参照して設定してください。

ここを読んでください:

http://httpd.apache.org/docs/2.4/mod/mod_expires.html

しかし、実際にできることは、コーディングするだけです!

これはあなたが知っている唯一のヘッダーであり、誰も mod の使用を強制しません。

mod_headers を使用してヘッダーを手動で設定するだけです。

ここを読んでください:

http://httpd.apache.org/docs/2.4/mod/mod_headers.html

etagを使用する必要があると本当に思うので、これについては例を挙げません。

于 2013-05-10T19:25:47.790 に答える
0

何かをする必要があるかどうかはわかりません。

Apache はすでにLast-modifiedヘッダーで応答していますか? (静的pngファイルの場合はそうあるべきです。)そうであれば、ブラウザはIf-modified-since後続のすべてのリクエストでヘッダーを送信する必要があります。これにより、実際に画像を再送信する代わりに、サーバーが HTTP 304 で応答するようになります。(ETagヘッダーも同様に機能します。)

ファイルを更新すると (年に 1 回)、ファイルの更新時間が変更され、その後のすべての要求で新しいバージョンの png ファイルが取得されます。

このアプローチの欠点は、すべてのブラウザがレンダリングしようとしている画像ごとにサーバーにリクエストを送信することです。そのため、ログに多くの 304 が表示されます。しかし、数キロバイトの画像ファイルと比較すると、その 304 トラフィックは (一般的に) ごくわずかです。

于 2013-05-10T19:13:47.077 に答える