私はキャッシュコントロールホスティングを使用して、ブラウザ、プロキシ、CDNがどのようにコンテンツをキャッシュするかを特別に制御し、ページの読み込みを速くし、なおかつ最新の状態を維持できるようにしている。そのために、私はターゲットを絞った 指令 max-age、no-cache、no-storeなどを設定することで、HTML、アセット、APIのパフォーマンス、鮮度、サーバー負荷のバランスをとることができます。.
中心点
以下の概要は、次のような最も重要なレバーを示している。 ウェブ最適化 キャッシュコントロール付き.
- TTL設計アセットには長い最大年齢、HTMLには短い時間または再検証。.
- バリデーションETagとLast-Modifiedは304レスポンスでデータトラフィックを削減する。.
- エッジコントロールCDNについては、s-maxage、stale-while-revalidate、stale-if-errorがある。.
- バージョニングハッシュ/バージョンを含むファイル名は、アグレッシブなキャッシュを可能にする。.
- モニタリングキャッシュのヒット率、304クォータ、TTFBを継続的にチェックする。.
ホスティングにおけるキャッシュ・コントロールはなぜ効果的なのか?
Originサーバーから キャッシュ, 遅延を減らし、帯域幅を節約する。適切に設定されたキャッシュ・コントロール・ヘッダは、ファイルの有効期間とクライアントがサーバーに要求するタイミングを制御します。私は、画像、CSS、JSなどのアセットの有効期間を長く設定する一方、HTMLの有効期間は短いか、常に検証されるようにしています。これは、ユーザーがキャッシュされたレスポンスに遭遇する頻度が高くなることを意味します。 現在の コンテンツ。私は、矛盾したヘッダーや欠落したバージョニングのような典型的なつまずきのブロックを早い段階で回避している。 キャッシュ修正ガイド.
基本: ディレクティブを正しく組み合わせる
と一緒に 最高年齢 no-cacheはクライアントに使用前の検証を強制するが、保存は禁止しない。no-storeは保存を一切排除し、支払いデータなどの機密性の高いレスポンスを保護する。publicはCDNなどの共有ストレージでのキャッシュを許可し、privateはブラウザのキャッシュに限定する。 バージョニング (例:app.v1.2.js)は素晴らしい追加機能だ。.
Varyヘッダーとキャッシュキーの明確な定義
キャッシュされたオブジェクトがリクエストタイプと一致することを確認する。その 可変-ヘッダは、それゆえ、すべての本格的なキャッシュ戦略に含まれる。これはキャッシュ・キーに影響を与え、誤った再利用を防ぐ:
- Accept-Encoding圧縮されたものと圧縮されていないものが別々にキャッシュされるようにするため。.
- Accept-Languageそうでなければ、断片化の危険性がある。.
- クッキーグローバルを避ける 変数: クッキー, それはキャッシュのヒット率を破壊するからです。その代わりに、関連するクッキー(例えばA/Bバリアント)に従って特別にセグメント化するか、エッジで無関係なクッキーを削除します。.
- 認証認証ヘッダーに依存するコンテンツは共有キャッシュに保存しないか、CDNプロバイダーがこれをサポートしている場合は、意図的にキーにしている。.
# Apache: HTML とアセットのための意味のある Vary ヘッダ
ヘッダマージ Vary "Accept-Encoding"
ヘッダマージ Vary "Accept-Encoding"
</ファイルマッチ
また、CDNのクリア・キャッシュ・キーのルールも定義している:トラッキングにのみ使用されるクエリーパラメーター(例:utm_*)はキーに含めない。これにより、新鮮さを損なうことなく、キーの爆発を防ぐことができる。.
実践:ApacheとNginxの設定
Apacheでは htaccess またはバーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャル・バーチャルHTMLをアセットから分離し、静的ファイルに長い寿命を与え、再バリデーションでHTMLを保護します。Expiresヘッダとの衝突を避け、モダンブラウザは主にキャッシュ制御を尊重します。Nginxでは、正しいadd_headerの位置を強制し、下流の命令がそれらを上書きしないようにします。このようにして ブラウザ・キャッシング スタック全体で一貫している。.
.
ヘッダーセット Cache-Control "public, max-age=31536000, immutable"
</ファイルマッチ
ヘッダーセット Cache-Control "no-cache, must-revalidate"
</ファイルマッチ
location ~* \.(css|js|png|jpg|svg|woff2)$ {.
add_header Cache-Control "public, max-age=31536000, immutable";
}
location ~* \.(html)$ { {.
add_header Cache-Control "no-cache, must-revalidate";
}
HTMLのCDN専用キャッシュ
ブラウザは常にチェックすべきだが、エッジがキャッシュを許可されている場合は、クライアントとCDNで異なるライフタイムを設定する:
# Apache: ブラウザが再検証され、Edgeが5分間キャッシュされた。
.
ヘッダーセット Cache-Control "public, max-age=0, s-maxage=300, must-revalidate, stale-while-revalidate=30, stale-if-error=86400"
ヘッダマージ Vary "Accept-Encoding"
# Nginx
location ~*.(html)$ {.
add_header Cache-Control "public, max-age=0, s-maxage=300, must-revalidate, stale-while-revalidate=30, stale-if-error=86400";
add_header Vary "Accept-Encoding";
}
検証:ETagとLast-Modifiedを効果的に使用する
コンバイン キャッシュ・コントロール をETagとLast-Modifiedを使って制御された方法で再検証します。有効期限が切れた後、ブラウザはIf-None-MatchまたはIf-Modified-Sinceを送信し、リソースが変更されていない場合、サーバーは304で応答します。 これはバイトを節約し、OriginのCPU時間を大幅に削減します。重要:ETagsは一貫していなければなりません。そうでなければ、コンテンツが変更されていないにもかかわらず、不必要な見逃しが発生します。クラスタ上では、弱いETagsを無効にしたり、強いハッシュを作成することで 再認定 は信頼できる。
マルチサーバー環境における一貫性
ETagsがノード間で異なるinodeベースの機能に基づいていないことを確認しています。安定したハッシュ(ビルドアーテファクト)を提供するか、デプロイがアトミックな場合はlast-modifiedに依存する。動的なレスポンスには、ペイロードハッシュと完全に一致するアプリケーションETagsを使用する。再バリデーションが再レンダリングよりも高くつく場合は、わざと200と短いTTLで応答する。.
資源タイプ別戦略
なぜなら、HTML、アセット、API、センシティブなレスポンスは、それぞれ異なるからです。 必要条件. .バージョン管理されたファイルには長いTTLが最良の値をもたらすが、HTMLは厳重に管理され続けなければならない。APIの寿命は短く計画し、フォールトトレランスを組み込む。個人的な回答や機密の回答は保存しないようにする。インターフェースに深く入り込む人は、以下のようなコンパクトなパターンから利益を得ることができる。 ホスティングにおけるAPIキャッシング, これは、私が反応の特徴に合わせたものだ。.
| リソースタイプ | 推奨指令 | 理由 |
|---|---|---|
| 静的アセット(画像、CSS、JS) | public, max-age=31536000, immutable | 長い保管期間、バージョン管理ができない ステール-コンテンツ |
| HTMLページ | no-cache、must-revalidate | 新鮮なコンテンツ 再認定 |
| API | public, max-age=300, stale-if-error=86400 | 期限は短く、以下の用途に使用可能 エラー |
| 機密データ | ノーストア | からの保管はない。 データ保護-理由 |
ステータスコード、リダイレクト、エラーページ
- 301 これは永続的なものであるため、キャッシュ(長いTTL)することができ、またそうすべきである。私は、後の変更を容易にするために、ターゲットURLをバージョン管理する。.
- 302/307 は一時的なもので、TTLが短いか再バリデーションが必要で、そうでなければキャッシュ内のパスが不正確になる危険性がある。.
- 404 私は短時間(例えば60~300秒)キャッシュし、実際のレクリエーションをブロックすることなく、欠陥のあるホットリンクがOriginに負担をかけないようにしている。.
- 500+ キャッシュはしないが、エッジは残す。 もしエラーなら ユーザーに最新情報を提供する。.
CDNとEdgeのための拡張ディレクティブ
と一緒に Sマクサージュ stale-while-revalidateは、エッジがバックグラウンドで更新している間、期限切れのコンテンツを配信し続ける。stale-if-errorは、バックエンドが停止している間もページへのアクセスを維持し、コンバージョンと信頼を高める。このコントロールは、キャッシュのヒット率に直接影響します。 スケーリング 特に交通のピーク時には。.
サロゲート・ヘッダーとエッジ・ヘッダー
エッジ・レンダリングのあるセットアップでは、サロゲート・ヘッダー(たとえば. サロゲート・コントロール)を使って、ブラウザの動作を変えることなく、よりCDN固有のTTLとステール・ポリシーを設定することができる。このようにして、私はエンドユーザーとエッジ戦略を厳密に分離し、両方のレベルに対するコントロールを維持している。.
無効化とリリース
私は意識的に無効化を計画している。バージョン管理されたアセットがパージを必要とすることはほとんどないが、HTMLとAPIルートは頻繁にパージを必要とする。私は以下のルーチンを明確に定義している:
- URL/パターンによるパージ ホットフィックスとエラーについて.
- タグベースのパージ (サポートされている場合) で、テーマに関連したコンテンツを無効にします。.
- 段階的ロールアウト最初にアセットをデプロイし、次にHTMLを新しい参照でデプロイする。.
WordPress:キャッシュを安全に実装する
WordPressでは、プラグインまたは独自のコードでヘッダーを有効化し、次のように観察します。 テンプレート-構造。wp-includesとuploadsの静的ファイルは長いTTLとimmutableを取得し、ページはmust-revalidateでno-cacheを取得します。ログインしているユーザーへの注意: プライベートクッキーと差別化クッキーは、キャッシュ内の誤ったパーソナライズを防ぎます。私は、明確なルールとこれらを見て、典型的なつまずきのブロックを排除します。 WordPressのキャッシュエラー. .必要であれば、サーバーサイド・ページ・キャッシングとOPCacheを追加して、PHPの実行が目立つようにする。 減少.
<?php
関数 add_cache_headers() {
if (!is_admin()){
header('Cache-Control: public, max-age=31536000, immutable', true);
}
}
add_action('send_headers', 'add_cache_headers');;
パーソナライゼーションとクッキーの打開策
私は、Set-Cookie ない はすべてのページで一律に設定されています。不要なクッキーは共有キャッシュを妨げます。ログインユーザーには明示的に配信しています:
# ログインセッションのヘッダーの例
Cache-Control: private, no-store, max-age=0
Vary: Accept-Encoding
一方、パーソナライズなしのリストと詳細ページは、CDNのフルパワーを利用する。パーソナライズが必要な場合は、エッジフラグメントや小さなAPIペイロードを使用し、残りは積極的にキャッシュしています。.
よくある間違いとその直し方
低すぎる TTL は不必要なサーバー作業と高いレスポンスタイムを生み出します。ヘッダーの欠落や矛盾は、ブラウザにヒューリスティックな動作を強い、パフォーマンスを犠牲にする。バージョン管理なしでは、長いキャッシュにもかかわらず、資産が古くなるリスクがある。複数のサーバーでETag戦略が異なると、ミスにつながります。一貫したハッシュを保証するか、ETagを無効にします。また、ゲートウェイなどの中間組織が、独自の ヘッダー と上書きする。.
ヒューリスティック・キャッシュを避ける
Cache-ControlもExpiresも設定されていない場合、ブラウザは推測します。そのため、私は常に明示的なディレクティブをオフにし、レガシーな問題 (例えば. Pragma: no-cache 決定論的な振る舞いを得るために、古いプロキシから)。.
クエリー文字列とキャッシュ破壊
私は、クエリ文字列の代わりにファイル名のハッシュ(style.abc123.css)を使ってキャッシュを破棄している。多くのキャッシュは異なるクエリを別々のオブジェクトとして扱うため、オブジェクトの数が増えます。一方、変更されていないファイルでは、新しいハッシュはクリーンな無効化につながります。.
モニタリング、テスト、メトリクス
私は効果を測定し、大々的な変更を行うのではなく、的を絞った修正を行う。 クリア. .curlを使ってヘッダーをチェックし、DevToolsを使ってファーストビューとリピートビューをシミュレートし、Lighthouseを使って主要な数値への影響を評価する。サーバーとCDN側では、キャッシュのヒット率、304クォータ、バイトセーブ、TTFBを監視しています。ログから、HTMLが本当に再検証されているか、アセットがほとんど再リクエストされないかどうかがわかります。これにより、早い段階でギャップを認識し、改善することができます。 ターゲット.
追加の診断信号
- 年齢-ヘッダは、オブジェクトがキャッシュに入ってからの時間を示す。.
- キャッシュの状態 (利用可能な場合)HIT/MISS/STALEとソース(BROWSER、CDN、ORIGIN)を明らかにする。.
- サーバータイミング ツールでパスを見えるようにするために、自分のマーカー(例えばcache;desc=“revalidated“)に使っている。.
私はCI/CDパイプラインでチェックを自動化している:各デプロイメントの後、小さなテストカタログがトップルートのヘッダー、ステータスコード、レスポンスサイズを検証する。リグレッションはすぐに気づかれます。.
SEOとビジネス効果
配信の高速化は、コアウェブ・バイタルを強化し、バウンドを減らし、配信速度を向上させる。 視認性. .ラウンド・トリップが回避されるたびにサーバー・コストが削減され、ピーク負荷のリスクも最小限に抑えられる。トラフィックが集中するサイトでは、毎月かなりのデータ量を節約しています。料金プランによっては、これが3桁のユーロになることもあります。キャッシュヒット率が高ければ、キャンペーンやセールスのレスポンスタイムも安定する。予測可能な方法でパフォーマンスを向上させる人は、通常、キャッシュヒット率も向上させます。 コンバージョン.
実践的チェックリスト 7つのステップ
(1) ファイルをインベントリ化し、HTML、アセット、API、センシティブなレスポンスを分離する。 セグメンテーション ルールが容易になる。(2) CSS/JS/画像にバージョニングを導入し、ファイル名にハッシュを使用し、immutableを設定する。(3) HTMLにはno-cacheとmust-revalidateを設定する。(4) APIに短いTTLを定義し、さらにstale-if-errorで失敗を軽減する。 滞在. .(5) ETagまたはLast-Modifiedを一貫して有効にする。(6) CDNとOriginのヘッダーを同期させる。(7) ヒット率、TTFB、バイトセーブを測定する。.
その他の実践的事例とサンプル
- 条件付きリクエストによるAPI短いTTLとETagで、共有キャッシュ(パブリック)にGET/HEADレスポンスを明示的に許可しています。POSTレスポンスは、正確に定義され、変更されない場合のみキャッシュします。.
- 大容量ファイルと範囲リクエストメディア向け 受諾範囲:バイト Edgeはダウンロードを再開する際にOriginを解放する。.
- レスポンシブ画像デバイスによって異なるイメージバリアントを出力する場合は、具体的に(例えばDPRやWidthに応じて)キーを設定し、あまり多くの信号で制御されないVaryを避けるようにしている。.
- ノー・トランスフォーム画質や暗号が重要な場合は、次のようにする。 キャッシュ制御:no-transform, プロキシがリソースを変更しないように。.
まとめ
私は、Cache-Controlを特に次のように使用している。 パフォーマンス, 適時性とコストを調和させるアセットには長いTTLとバージョニング、HTMLには再バリデーション、APIには短い期限を設定することで、確実に良い結果をもたらします。ETagとLast-Modifiedはデータトラフィックを減らし、s-maxageとstaleポリシーはエッジキャッシュを利用する。モニタリングは効果を可視化し、どこを強化すべきかを示してくれる。これにより、ホスティングは高速で、コントロールしやすく、経済的なものになる。 格好いい.


