Priority ヘッダー
HTTP の Priority ヘッダーは、同じ接続上の他のリソースリクエストと比較して、リクエストされたリソースを含む HTTP レスポンスが送信される優先順位について、クライアントが指定する優先順位を示します。
リクエストでこのヘッダーが指定されていない場合、デフォルトの優先順位が仮定されます。
また、サーバーは、クライアントが通知した優先順位設定を変更したいことを示すために、レスポンスにこのヘッダーを設定することもあります。
レスポンスにおいて、この情報は、キャッシュサーバーやレスポンスを転送するその他のサーバーにおける優先順位付けプロセスの入力情報として使用することができます。
サーバーはクライアントの優先順位設定に拘束されるものではなく、クライアントの優先順位を、自分自身で実施する優先順位付けプロセスの参考情報としてのみ使用する場合があります。 例えば、サーバーは、特定の画像がユーザーの使い勝手にとって極めて重要であり、最優先で送信すべきであることを認識している場合があります。 また、サーバーによる優先順位付けは、ネットワークの輻輳などの要因によって影響を受ける場合もあります。
このリクエストはキャッシュされることがあります。サーバーは、Cache-Control や Vary など、キャッシュ動作を制御するヘッダーフィールドを使用して、キャッシュの可否やキャッシュされたレスポンスの適用可否を制御することが期待されます。
メモ:
このヘッダーは、RFC 9218 で定義されている「HTTP 用拡張優先順位付けスキーム」の一部です。
また、HTTP/2 や HTTP/3 には PRIORITY_UPDATE フレームがあり、リソースのリクエストを送信した後にその優先順位を変更するために使用することができます。
このリクエストは、どのバージョンの HTTP でも送信可能です。
| ヘッダー種別 | リクエストヘッダー, レスポンスヘッダー |
|---|---|
| 禁止リクエストヘッダー | いいえ |
構文
Priority: u=<priority>
Priority: i
Priority: u=<priority>, i
ディレクティブ
u=<priority>-
「緊急度」 (
u) 引数は、リソースの優先度値<priority>を指定します。 この値は 0 以上 7 以下の整数であり、優先度の高い順に並んでいます(0 が最も緊急度が高い)。 リクエストのデフォルトの優先度値は 3 です。 レスポンスにはデフォルトの優先度値はありません。レスポンスにこのヘッダーが含まれていない場合は、サーバーがクライアントの優先度を変更しないことを選択したことを示します。 優先度 7 は、バックグラウンドタスクやソフトウェア更新の配信など、使い勝手に影響を与える可能性が低いリソースに対してのみ使用すべきです。ブラウザーは、他のリソースを使用する可能性が高い文書については、デフォルトの優先度でリクエストを行うべきです。 その後、参照されるリソースについては、その到着時間が使い勝手に与える相対的な影響を反映した値を用いてリクエストを行う必要があります。
サーバーは、クライアントとは異なる優先順位の解釈を持つことができる場合があり、中間サーバーに優先順位のヒントを与えるために、異なる値をレスポンスとして返すことがあります。 中間サーバーは、この値を元のリクエストの優先順位と併せて考慮する場合があります。 レスポンスに
Priorityヘッダーが持たれていない場合は、サーバーがクライアントの優先順位を変更しないことを選択したことを示しています。 i-
インクリメンタル (
i) ディレクティブが存在する場合、HTTP レスポンスを段階的に処理することが可能であることを示します。段階的に処理できるリソースとは、リソース全体が利用できるのを待つのではなく、チャンクが届き次第、受信側がすぐに何か有益な処理を行えるようなリソースのことです。
ブラウザーでこのディレクティブが設定された場合、サーバーは、同じ優先度を持つすべての増分リクエストを並行して処理することを選択できます。 これにより、複数のリクエストが接続帯域幅全体に分散されるため、すべてのリクエストの処理開始は早くなりますが、完了までの総所要時間は長くなります。
ブラウザーがこのディレクティブを設定していない場合、そのリソースを段階的に処理しないことを示しています。 この場合、サーバーは、関連付けられたリクエストが生成された順序に従って、同じ緊急度を持つレスポンスを 1 つずつ送信する必要があります。
メモ: サーバーは、このヘッダーに含まれる、自身が理解できないディレクティブを無視することが期待されています。 今後追加される新しいディレクティブは、これらの既存のディレクティブと互換性があることが想定されており、そのため、それらを安全に無視することが可能です。
例
>リソースの緊急度の設定
次の例は、HTML ファイルに対するリクエストを示しています。
緊急度は設定されていないため、デフォルト値の 3 となり、i は false となります。
これは、他のリソースを所有する文書に対する通常の設定です。
:method = GET
:scheme = https
:authority = example.net
:path = /index.html
下記のリクエストは、HTML で使用されている CSS ファイルに対する、可能性のある追跡リクエストです。
緊急度は 2 に設定されており、ブラウザーがこのリクエストをかなり高い優先度と見なしていることを示していますが、CSS ファイルは増分処理ができないため、i は設定されていません。
:method = GET
:scheme = https
:authority = example.net
:path = /style.css
priority = u=2
メモ: 以上のリクエストでは、HTTP/2 または HTTP/3 仕様で定義されている、人間が読み取り可能な書式が使用されています。 このドキュメントの大部分で使用されている HTTP/1.1 形式は、同様に次のようなものになります。
GET /style.css HTTP/1.1
Host: example.net
Priority: u=2
レスポンスは、下記のように表示される場合があります。
なお、この場合 priority が指定されていません。これは、サーバーが中間サーバーの優先順位を変更する必要はないと判断したことを示しています。
:status: 200
content-type: text/css
content-length: 610
date: [current date]
インクリメンタルディレクティブの設定
下記ヘッダーは、段階的にレンダリング可能な画像に対するブラウザーのリクエストを示しています。
この場合、優先度は 4(デフォルトの 3 より低い値)に設定されており、i が設定されていることで、クライアントが JPG ファイルを段階的に処理可能であることが示されています。
:method = GET
:path = /image.jpg
:scheme = https
:authority = example.net
priority = u=4, i
サーバーからは、下記のようなレスポンスが返されることがあります。 この場合、優先度は 1 に設定されており、サーバーはその具体的な画像を高い優先度で送信すべきであると認識していることを示しています。
:status: 200
content-type = image/jpeg
content-length = 610
...
priority = u=1, i
仕様書
| 仕様書 |
|---|
| Extensible Prioritization Scheme for HTTP> # header-field> |