4

私のアプリケーションでは、ユーザーは自分のサイトの CSS を変更するオプションを持っています。

これが頻繁に変更される可能性は低いですが、変更された場合は、彼らとそのサイトの訪問者がすぐに結果を確認できるようにする必要があります.

ユーザーが CSS を更新した日時を記録するので、URL にタイムスタンプを追加するだけで簡単に解決できます。

ただし、キャッシュ ヘッダーをプログラムで設定して、CSS ファイルが変更された場合にブラウザーに強制的に再要求させることができるかどうかを知りたいです。

4

2 に答える 2

4

URLにハッシュを含める場合、つまり

http://server.example.com/styles/css.css?hash 

ブラウザは新しい URL から取得するため、ハッシュが変更されると再ロードされます。

バージョン 1:

<style type="text/css" link="styles/css.css?hash=v1" />

バージョン 2:

<style type="text/css" link="styles/css.css?hash=v2" />

クライアントのキャッシングはクライアントの問題です。必要に応じて実行させてください。新しい URL は、リソースが変更されたことを意味するため、リロードする必要があります。キャッシュ制御ヘッダーを使用して同じ URL を保持すると、クライアントの実装が異なるため、苦痛の世界につながる可能性があります。

キャッシュ制御ヘッダー (last-modified、expires、ETAG) を配置すると、CSS が変更されたときに更新されるかどうかを確認できません。

  • 積極的なブラウザ (またはプロキシ) のキャッシュはそれらを無視する可能性があるためです。
  • 5 月 1 日に有効期限が 6 月 1 日の V1 を提供し、5 月 15 日に V2 に更新すると、クライアントは新しいバージョンを取得するまで 15 日間待たなければならないためです。

URL ハッシュの場合、最悪のシナリオは、クライアントが CSS をキャッシュに入れないことですが、常に最新バージョンを取得するため、ユーザー エクスペリエンスは変更されません。

有効期限または最終更新日がある場合、最悪のケースは、クライアントが古いバージョンを取得することであり、これによりユーザー エクスペリエンスが変更されます :)

于 2012-06-13T12:27:48.410 に答える
1

Mathieu の応答のおかげで、キャッシュの無効化を処理するために、出力キャッシュとバージョン番号の組み合わせを使用しています。

出力キャッシュ プロファイル:

タイムスタンプを追加するために、次の拡張メソッドを作成しました。

    public static string AppendTimeStamp(this string src, DateTime lastModified)
    {
        if (string.IsNullOrEmpty(src))
            return src;

        return string.Format("{0}?v={1}", src, lastModified.ToString("yyyyMMddHHmmss"));
    }

使用法:

<link rel="stylesheet" href="@Url.Content("~/assets/usercss").AppendTimeStamp(CustomizationSettings.LastModified)"/>

ファイルをキャッシュしたくない場合はDateTime.UtcNow、最終更新日として渡すことができます。

于 2012-06-13T13:06:18.913 に答える