検索
ホームページウェブフロントエンドhtmlチュートリアルブラウザのキャッシュ、愛していると言うのは簡単ではありません_html/css_WEB-ITnose

今日、Xiaowei Kaidianbao がテスト環境でアップデートをリリースしたとき、同僚が次のように尋ねました。「変更を確認するためにブラウザのキャッシュを手動でクリアする必要があるのはなぜですか? システムの終了後、顧客もブラウザのキャッシュを自分でクリアする必要がありますか?」オンラインになりますか? 「この穴を埋める必要があるようです。

ブラウザー キャッシュとは何ですか?

ブラウザー キャッシュとは、ユーザーが最近リクエストしたドキュメントをブラウザーがローカル ディスクに保存し、訪問者が同じページに再度アクセスしたときに、ブラウザーがドキュメントをローカル ディスクから直接ロードできることを意味します。

ブラウザキャッシュの利点は次のとおりです:

  1. 冗長なデータ送信を削減し、ネットワーク料金を節約します
  2. サーバーの負担を軽減し、Webサイトのパフォーマンスを大幅に向上させます
  3. クライアントのWebページの読み込み速度を高速化します

前に-開発面接の終わりに、ブラウザ キャッシュは Web パフォーマンス最適化面接の質問において非常に重要な知識ポイントであり、ブラウザ キャッシュが Web パフォーマンスを向上させる優れたツールであることを示しています。しかし、ブラウザ キャッシュが不適切に使用されると、多くの問題も発生します。問題は、よく言われるように、愛していると言うのが簡単ではないことです。したがって、この記事では、最近遭遇した事例と組み合わせて、ブラウザのキャッシュに関連する知識を要約し、読者の役に立ちたいと考えています。

ブラウザ キャッシュの分類

ブラウザ キャッシュには、キャッシュ ネゴシエーションと徹底キャッシュの 2 つの主なタイプがあり、ネゴシエーション キャッシュや強力なキャッシュとも呼ばれます。

ブラウザが最初のリクエスト後に再度リクエストを行うと、

  1. ブラウザはまずリソースのキャッシュされたヘッダー情報を取得し、有効期限とキャッシュ制御に基づいて強力なキャッシュにヒットするかどうかを判断します。キャッシュに直接アクセスし、キャッシュされたヘッダー情報を含むリソースをキャッシュから取得します。
  2. 強力なキャッシュがヒットしない場合、リクエストはサーバーに送信されます。最初のリクエストによって返されたキャッシュ関連情報 (Last-Modified/IF-Modified-Since、Etag/IF-None-Match) を保持すると、サーバーはリクエスト内の関連するヘッダー情報に従って結果を比較します。ネゴシエーション キャッシュにヒットするかどうかを確認します。ヒットした場合、サーバーは、キャッシュ内の対応するヘッダー情報を更新しますが、リソースのコンテンツを直接取得できることをブラウザーに伝えません。それ以外の場合は、最新のリソース コンテンツが返されます

強力なキャッシュ

強力なキャッシュは、リソースのキャッシュ時間を示すために使用される Expires または Cache-Control の 2 つのフィールドによって制御される http のリターン ヘッダーを使用します。

Expires このフィールドは http1.0 の仕様であり、その値は Expires:Mon,18 Oct 2066 23:59:59 GMT などの GMT 形式の絶対時刻文字列です。この時間は、このリソースの有効期限を表します。この時間より前にキャッシュがヒットします。この方法には明らかな欠点があり、有効期限は絶対時間であるため、サーバーとクライアント間の時間のずれが大きい場合、キャッシュの混乱が発生します。

Cache-Control

Cache-Control は http1.1 に出現するヘッダー情報であり、主にこのフィールドの max-age 値を使用して判断されます。 Cache-Control:max などの相対時間です。 -age= 3600 は、リソースが 3600 秒間有効であることを意味します。このフィールドに加えて、cache-control には次のより一般的に使用される設定値もあります:
no-cache: ローカル キャッシュを使用しません。キャッシュ ネゴシエーションを使用して、返された応答が変更されているかどうかを最初にサーバーに確認する必要があります。前の応答に ETag がある場合、リソースが変更されていない場合は、サーバーで検証されます。再ダウンロードを回避できます。

  • no-store: ブラウザーによるデータのキャッシュを直接禁止します。ユーザーがリソースをリクエストするたびにリクエストがサーバーに送信され、毎回完全なリソースがダウンロードされます。
  • public: エンド ユーザーや CDN などの中間プロキシ サーバーを含むすべてのユーザーがキャッシュできます。
  • プライベート: エンド ユーザーのブラウザによってのみキャッシュでき、CDN などのリレー キャッシュ サーバーによってキャッシュすることは許可されません。
  • サーバー構成でキャッシュ制御と有効期限を同時に有効にすることができます。同時に有効にした場合、キャッシュ制御の方が優先されます。

    ネゴシエーションキャッシュ

    ネゴシエーションキャッシュとは、サーバーがキャッシュリソースが利用可能かどうかを判断することを意味します。そのため、クライアントとサーバーは、リクエストされたリソースをキャッシュしてアクセスできるかどうかをサーバーが判断できるように、ある種の識別子を介して通信する必要があります。これには主に次の 2 セットのヘッダー フィールドが含まれます。これら 2 セットのパートナーはペアで表示されます。つまり、最初のリクエストの応答ヘッダーには特定のフィールド (Last-Modified または Etag) が含まれ、後続のリクエストには対応するフィールドが含まれます。リクエスト フィールド (If -Modified-Since または If-None-Match)、応答ヘッダーに Last-Modified フィールドまたは Etag フィールドがない場合、リクエスト ヘッダーには対応するフィールドがありません。

    Last-Modify/If-Modify-Since

    ブラウザが初めてリソースをリクエストすると、サーバーから返されるヘッダーに Last-Modify が追加されます。 Last-modify は、リソースを識別するタイムスタンプです。リソースの最終変更時刻 (例: Last-Modify: Thu,31 Dec 2037 23:59:59 GMT)。

    ブラウザがリソースを再度リクエストすると、リクエスト ヘッダーには、キャッシュする前に返される Last-Modify である If-Modify-Since が含まれます。サーバーは If-Modify-Since を受信すると、リソースの最終変更時刻に基づいてキャッシュがヒットしたかどうかを判断します。

    キャッシュがヒットした場合、304 が返され、リソースのコンテンツは返されず、Last-Modify も返されません。

    ETag/If-None-Match

    Last-Modify/If-Modify-Since とは異なり、Etag/If-None-Match はチェック コードを返します。 ETag は各リソースが一意であることを保証でき、リソースが変更されると ETag も変更されます。サーバーは、ブラウザーから送信された If-None-Match 値に基づいてキャッシュがヒットしたかどうかを判断します。

    Last-Modified とは異なり、サーバーが 304 Not Modified 応答を返す場合、ETag は再生成されているため、ETag が以前のものから変更されていない場合でも、ETag は応答ヘッダーで返されます。

    Etag が必要な理由

    ローカル キャッシュ コピーが十分に新しいかどうかをブラウザーに知らせるには Last-Modified を使用するだけで十分だと思うかもしれませんが、なぜ Etag が必要なのでしょうか? HTTP1.1 での Etag の登場は、主に Last-Modified では解決するのが難しいいくつかの問題を解決するためです。

    一部のファイルは定期的に変更される可能性がありますが、その内容は変更されません (現時点では、変更時刻のみが変更されます)。クライアントがファイルが変更されたと考えて再取得することは望ましくありません。
  • 一部のファイルは、数秒未満で変更される (たとえば、1 秒間に N 回変更される)、If-Modified など、非常に頻繁に変更されます。 - チェックできる粒度は s レベルであるため、この種の変更を判断することはできません (または、UNIX の記録 MTIME は秒単位までしか正確ではありません)。一部のサーバーでは、ファイルの最終変更時刻を正確に取得できません。
  • Last-Modified と ETag は一緒に使用できます。サーバーは最初に ETag を検証し、それらが一致している場合は、Last-Modified の比較を続け、最終的に 304 を返すかどうかを決定します。
  • 強力なキャッシュとネゴシエートされたキャッシュの違いは、次の表で表すことができます: |リソースフォームを取得|ステータスコード|サーバーにリクエストを送信

    ------|---------- --- |------|----------------

    強力なキャッシュ|キャッシュから取得|200 (キャッシュから)|いいえ、キャッシュから直接取得します
    交渉キャッシュ|キャッシュから取得|304 (未変更)|いいえ、キャッシュが利用可能かどうかをサーバーに伝えます
    キャッシュに対するユーザーの行動の影響

    ユーザー操作の期限切れ/キャッシュ制御の最終変更日/Etag

    Enter キーを押してくださいアドレスバー有効有効ページリンクジャンプ有効有効新しいウィンドウ有効有効前後に有効有効F5 更新無効 有効Ctrl+F5 強制更新無効無効 記事の冒頭で述べたように、ユーザーのブラウザは、コードはオンラインで更新されるため、お客様にシステムの更新を依頼することはできません。その後、キャッシュ クリーニング操作を実行します。
    実際の問題の分析

    どうやって解決しますか?

    リソースリクエスト URL にパラメーターを追加します (例: js/mian.js?ver=0.7.1)。このパラメータはバージョン番号であり、このパラメータが変更されると、強力なキャッシュが無効化され、再ロードされます。このように、静的リソースはデプロイ後に再ロードする必要があります。これにより、問題はより完全に解決されます。 さらなる考察

    これが最も完璧な方法でしょうか?残念ながら、そうではありません。

    Baidu Zhang Yunlong は、これを行うことの欠点について説明しました。興味がある場合は、以下を参照してください:

    静的リソースのバージョンの更新とキャッシュ

    ありがとうございます。

    声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
    HTML、CSS、およびJavaScriptの理解:初心者向けガイドHTML、CSS、およびJavaScriptの理解:初心者向けガイドApr 12, 2025 am 12:02 AM

    webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

    HTMLの役割:Webコンテンツの構造HTMLの役割:Webコンテンツの構造Apr 11, 2025 am 12:12 AM

    HTMLの役割は、タグと属性を使用してWebページの構造とコンテンツを定義することです。 1。HTMLは、読みやすく理解しやすいようなタグを介してコンテンツを整理します。 2。アクセシビリティとSEOを強化するには、セマンティックタグなどを使用します。 3. HTMLコードの最適化により、Webページの読み込み速度とユーザーエクスペリエンスが向上する可能性があります。

    HTMLとコード:用語を詳しく見るHTMLとコード:用語を詳しく見るApr 10, 2025 am 09:28 AM

    htmlisaspecifictypeofcodefocuseduructuringwebcontent

    HTML、CSS、およびJavaScript:Web開発者に不可欠なツールHTML、CSS、およびJavaScript:Web開発者に不可欠なツールApr 09, 2025 am 12:12 AM

    HTML、CSS、およびJavaScriptは、Web開発の3つの柱です。 1。HTMLは、Webページ構造を定義し、などなどのタグを使用します。2。CSSは、色、フォントサイズなどのセレクターと属性を使用してWebページスタイルを制御します。

    HTML、CSS、およびJavaScriptの役割:コアの責任HTML、CSS、およびJavaScriptの役割:コアの責任Apr 08, 2025 pm 07:05 PM

    HTMLはWeb構造を定義し、CSSはスタイルとレイアウトを担当し、JavaScriptは動的な相互作用を提供します。 3人はWeb開発で職務を遂行し、共同でカラフルなWebサイトを構築します。

    HTMLは初心者のために簡単に学ぶことができますか?HTMLは初心者のために簡単に学ぶことができますか?Apr 07, 2025 am 12:11 AM

    HTMLは、簡単に学習しやすく、結果をすばやく見ることができるため、初心者に適しています。 1)HTMLの学習曲線はスムーズで簡単に開始できます。 2)基本タグをマスターして、Webページの作成を開始します。 3)柔軟性が高く、CSSおよびJavaScriptと組み合わせて使用​​できます。 4)豊富な学習リソースと最新のツールは、学習プロセスをサポートしています。

    HTMLでの開始タグの例は何ですか?HTMLでの開始タグの例は何ですか?Apr 06, 2025 am 12:04 AM

    Anexampleapalofastartingtaginhtmlis、それはaperginsaparagraph.startingtagsaresentionentientiontheyinitiateelements、definetheirtypes、およびarecrucialforurturingwebpagesandcontingthomedomを構築します。

    CSSのフレックスボックスレイアウトを使用して、メニューの点線のラインセグメンテーション効果のセンターアラインメントを実現する方法は?CSSのフレックスボックスレイアウトを使用して、メニューの点線のラインセグメンテーション効果のセンターアラインメントを実現する方法は?Apr 05, 2025 pm 01:24 PM

    メニューで点線のラインセグメンテーション効果を設計する方法は?メニューを設計するときは、通常、皿の名前と価格の間に左右に合わせることは難しくありませんが、真ん中の点線またはポイントはどうですか...

    See all articles

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    AtomエディタMac版ダウンロード

    AtomエディタMac版ダウンロード

    最も人気のあるオープンソースエディター

    SecLists

    SecLists

    SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

    DVWA

    DVWA

    Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 新バージョン

    SublimeText3 Linux 最新バージョン

    EditPlus 中国語クラック版

    EditPlus 中国語クラック版

    サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません