103 Early Hints
使い方
サーバーが 103 Early Hints を送信すると、クライアントは Link ヘッダーを解釈し、指定されたリソースを先読みします。これは、サーバーが最終レスポンスを組み立てる前にリクエストの処理に時間を要する場合に最も有用です。サーバーが処理しているあいだ、クライアントは最終的なページが必要とするスタイルシート、画像、スクリプトの読み込みに時間を使えます。
注意
最終的な HTTP レスポンスに先立って、複数の 103 Early Hints レスポンスが送信されます。
ヒントは保証ではない
予測に依存するあらゆるシステムと同様に、的中率はさまざまです。サーバーが 103 Early Hints を返して特定のリソースの取得をクライアントに提案する場合、その提案は妥当な仮定に基づいています。権威ある Link ヘッダーを提供するのは最終的な HTTP レスポンスだけです。
ヒントと最終ヘッダーのずれは2つの形で現れます。最終レスポンスがヒントに挙がっていない追加のリソースを必要とする場合と、早期ヒントとして取得したリソースが不要だと判明する場合です。後者では、クライアントが無駄な作業を行ったことになり、トランザクション全体の所要時間が増加します。
早期ヒントに基づいて実行される操作は安全です。たとえば、GET メソッドの使用はサーバーの状態を変更しません。
SEO への影響
103 Early Hints は最終ステータスコードに先行する情報レスポンスです。検索エンジンのクローラーは中間の情報レスポンスではなく最終レスポンスを処理します。早期ヒントによるパフォーマンス向上はブラウザに適用されるものであり、クローラーには適用されません。このステータスコードは安全に使用でき、Google のページ処理を妨げません。
サーバープッシュの置き換え
103 Early Hints の仕組みは、rel=preload を用いるリソースヒントのフレームワークの一部として、現代のブラウザにおけるサーバープッシュの仕組みを置き換える位置づけにあります。サーバープッシュとは異なり、103 Early Hints はブラウザが指定されたリソースの取得を開始するにあたって最終レスポンスに依存しません。
注意
セキュリティ上の理由から、ブラウザは 103 Early Hints の利用を HTTP/2 と HTTP/3 の接続のみに制限しています。
例
クライアントが index.html ファイルを要求し、サーバーは必要になりそうなリソースについて3つのヒントを返します。サーバーはまだレスポンスを生成中のため、要求されたファイルはメッセージボディに含まれていません。クライアントは各 Link ディレクティブで指定されたリソースの読み込みを開始します。
短い遅延ののち、サーバーは公式の Link ディレクティブとメッセージボディ内の index.html とともに最終的な 200 レスポンスを返します。早期ヒントと最終的なリソース一覧の違いに注目してください。
リクエスト
GET /index.html HTTP/1.1
Host: example.com
レスポンス
HTTP/1.1 103 Early Hints
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </videos/instructions_simple.mp4>; rel=preload; as=video
<there is a short pause in the transmission>
HTTP/1.1 200 OK
Content-Type: text/html; charset=UTF-8
Content-Length: 100
Link: </style.css>; rel=preload; as=style
Link: </images/logo.svg>; rel=preload; as=image
Link: </images/pro_badge.svg>; rel=preload; as=image
Link: </videos/instructions_advanced.mp4>; rel=preload; as=video
<message body will follow>
最初の早期ヒントのリソースである style.css は、ロゴ画像および instructions_simple.mp4 の動画とともにクライアントによって取得・処理されます。スタイルシートとロゴはいずれもそのまま利用できます。最終レスポンスにある pro_badge 画像はヒントに現れないため、クライアントは最終レスポンスを受け取ってからこのリソースを取得します。
最終的な Link ヘッダーにある instructions_advanced.mp4 の動画は早期ヒントのものとは異なります。サーバーは早期ヒントで instructions_simple.mp4 を提案しましたが、その取得は不要でした。新たに指定された動画は index.html が完全にレンダリングされる前に取得・処理される必要があり、動画が1本ではなく2本取得されたため、読み込み時間はおそらく増加します。
コードリファレンス
.NET
HttpStatusCode.EarlyHints
Rust
http::StatusCode::EARLY_HINTS
Rails
:early_hints
Go
http.StatusEarlyHints
Symfony
Response::HTTP_EARLY_HINTS
Python3.9+
http.HTTPStatus.EARLY_HINTS
Apache HttpComponents Core
org.apache.hc.core5.http.HttpStatus.SC_EARLY_HINTS
Angular
@angular/common/http/HttpStatusCode.EarlyHints