| インターネット技術標準化委員会 (IETF) | M. Nottingham |
| Request for Comments: 8288 | 2017年9月 |
| Obsoletes: 5988 | |
| カテゴリ: 標準化トラック | |
| ISSN: 2070-1721 |
Web リンク
概要
本仕様は、Web 上のリソース間の関係(「リンク」)およびその関係の種類(「リンク関係タイプ」)のモデルを定義します。
また、Link ヘッダフィールドを用いた HTTP ヘッダ内でのそのようなリンクの直列化も定義します。
このメモのステータス
これはインターネット標準化トラック文書です。
本書はインターネット技術標準化委員会(IETF)の成果物です。本書は IETF コミュニティの合意を表しており、公開のために公開レビューを受け、インターネット技術運営指導グループ(IESG)によって承認されています。インターネット標準に関する詳細は RFC 7841 のセクション2 を参照してください。
本書の現在のステータス、正誤表、およびフィードバックの提供方法に関する情報は https://www.rfc-editor.org/info/rfc8288 で入手できます。
Copyright Notice
Copyright (c) 2017 IETF Trust and the persons identified as the document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Simplified BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Simplified BSD License.
This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.
1. はじめに
本仕様は、Web 上のリソース間の関係(「リンク」)およびそれらの関係の種類(「リンク関係タイプ」)のモデルを定義します。
HTML [W3C.REC-html5-20141028] と Atom [RFC4287] はいずれもリンクの概念を明確に定義しています。Section 2 はこれらの形式や(場合によっては)他の場所でのリンクを包含する枠組みにこれを一般化します。
さらに、Section 3 はそのようなリンクを伝達するための HTTP ヘッダフィールドを定義します。
1.1. 記法上の規約
本書中のキーワード “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”, “MAY”, および “OPTIONAL” は、BCP 14 [RFC2119] および [RFC8174] に示される通り、かつその大文字形で現れる場合に限り解釈されます。
本ドキュメントは、拡張バッカス・ノール形式(ABNF)を RFC5234 [RFC5234] の表記法で使用し、#rule を含め、明示的に次のルールを含みます: quoted-string, token, SP (space), BWS (bad whitespace), OWS (optional whitespace), RWS (required whitespace), LOALPHA, DIGIT(いずれも [RFC7230] に基づきます)。
さらに、以下のルールも含まれます:
- URI および URI-Reference(RFC3986 から)
- type-name および subtype-name(RFC6838 から)
- media-query-list(W3C の Media Queries から)
- Language-Tag(RFC5646 から)
1.2. 適合性とエラー処理
[RFC7230] の Section 2.5 で強調されている適合性およびエラー処理に関する要件は本ドキュメントにも適用されます。
2. リンク
本仕様において、リンクとは 2 つのリソース間の型付けされた接続であり、次の要素から構成されます:
- リンクコンテキスト、
- リンク関係タイプ(Section 2.1)、
- リンクターゲット、
- および任意でターゲット属性(Section 2.2)。
リンクは「リンクコンテキストがリンクターゲットに対してリンク関係タイプを有し、そのターゲットがターゲット属性を持つ」といった形式の述語として見ることができます。
例えば “https://www.example.com/” は “https://example.com” に “canonical” なリソースを持ち、そのリソースの “type” は “text/html” である、という具合です。
リンクコンテキストとリンクターゲットはいずれも国際化リソース識別子(IRI) [RFC3987] です。ただし一般的には、リンクコンテキストは多くのプロトコル(例えば HTTP)が IRI の直接参照をサポートしていないため、URI でもあることが多いです。同様に、リンクターゲットは直列化が IRI をサポートしない場合(本仕様で定義する Link ヘッダフィールド等)には URI に変換されることがあります(RFC3987 Section 3.1 を参照)。
本仕様はリンクの基数(cardinality)に制限を課しません。特定のターゲットへのリンクや同一のコンテキストとターゲット間の複数の同種または異種のリンクが存在し得ます。また、ある直列化におけるリンクの順序や直列化間(例えば Link ヘッダと本文内リンク)の相対的順序は本仕様では指定されず重要でもありません。順序を重要視したいアプリケーションは独自に扱うことができます。
リンクはリンク直列化で伝達されます;それらは「オン・ザ・ワイヤ上のバイト」であり、様々な形式で現れます。例えば Atom や HTML はそれぞれの形式にリンクを直列化する方法を定義しており、Section 3 は HTTP ヘッダフィールドでリンクを直列化する方法を定義します。
本仕様は異なる直列化間でのリンクの一般的な構文を定義せず、また特定のリンクに対するコンテキストを強制しません。直列化は通常これらの両方を指定することが期待されます。
最後に、リンクはリンクアプリケーションによって使用されます。一般に、アプリケーションは使用するリンク関係タイプと、それらが現れる可能性のある直列化を定義します。例えば「ウェブブラウジング」アプリケーションは HTML のリンク直列化(およびオプションで Link ヘッダフィールド)内の “stylesheet” を探す一方で、「AtomPub」アプリケーションは Atom 直列化内で “edit” や “edit-media” を使用します。
2.1. リンク関係タイプ
単純なケースでは、リンク関係タイプはリンクの意味を識別します。例えば、relation type が “copyright” のリンクは、現在のリンクコンテキストがリンクターゲットに著作権リソースを持つことを示します。
リンク関係タイプは、ターゲットリソースが特定の属性を持つ、または特定の振る舞いを示すことを示すためにも使用できます。例えば “service” のリンクはリンクターゲットが定義されたプロトコルの一部として使用可能であることを暗示します(サービス記述など)。
関係タイプはメディアタイプ(RFC2046)と混同してはなりません;それらはリンクを逆引きした際に得られる表現のフォーマットを識別するものではありません。むしろ、現在のコンテキストが別のリソースとどのように関連しているかを説明するものです。
関係タイプは、他の関係タイプの存在や発生回数に基づいて追加の意味を推論すべきではありません。ただし例外として、歴史的理由により HTML では “alternate” と “stylesheet” の組合せが特別な意味を持ちます。
関係タイプには登録(registered)と拡張(extension)の 2 種類があります。
2.1.1. 登録済み関係タイプ
明確に定義された関係タイプは便宜上または他のアプリケーションによる再利用を促進するため、Section 2.1.1.1 の手順に従ってトークンとして登録できます。
登録済み関係タイプ名は reg-rel-type ルール(Section 3.3 を参照)に準拠し、文字ごとにケースインセンシティブに比較されなければなりません。意味が特定のアプリケーションに高度に特化している場合はそれを反映する名前にすべきで、より一般的な名前をより汎用的な用途に残すべきです。
登録済み関係タイプはリンクコンテキストのメディアタイプを制約してはならず、リンクターゲットの利用可能な表現メディアタイプを制約してはなりません。ただし、ターゲットリソースの振る舞いやプロパティ(許容される HTTP メソッドやサポートが要求されるリクエスト/レスポンスのメディアタイプなど)を指定することはできます。
歴史的には、登録済み関係タイプはアプリケーション定義のベース URI を接頭辞として付与することで URI として識別されてきました(例は Appendix A.2 を参照)。この慣行は推奨されません。なぜなら結果として得られる文字列は他のアプリケーションから登録済み関係タイプと同等と見なされないからです。そのような URI を内部的に使用するアプリケーションは、明示的にそれらを扱える直列化でのみ使用すべきです。
2.1.1.1. リンク関係タイプの登録手順
“Link Relations” レジストリは “https://www.iana.org/assignments/link-relations/” にあります。登録要求はそこでの指示に従うか、あるいは “link-relations@ietf.org” メーリングリストへメールを送ることで行えます。
登録要求には少なくとも以下の情報を含む必要があります:
- Relation Name: 関係タイプの名前
- Description: そのタイプの意味に関する簡潔な英語の説明。リンクコンテキストとリンクターゲットの関係の観点で記述することが推奨されます。
- Reference: 関係タイプを定義する文書への参照(可能であればその文書を取得できる URI を含む)。該当セクションの指示も含めてもよいが必須ではありません。
専門家はレジストリに収集する追加フィールドを定義することができます。
登録の一般要件は Section 2.1.1 に記載されています。
登録は自由に入手できる安定した仕様を参照しなければなりません。
未登録の関係タイプが広く展開されており、そうでないと迅速に登録される見込みがないと専門家が判断した場合、第三者(専門家を含む)が登録できることに注意してください。そのような登録も仕様への参照を含む要件に従います。
2.1.1.2. 登録要求の処理
関係タイプは Specification Required ポリシー(RFC8126 Section 4.6 を参照)を用いて登録され、指定専門家によるレビューと承認を伴います。
レジストリの目的はインターネット上でのリンクの一般的使用を反映することです。したがって、専門家は濫用的、無意味、インターネット上で使用される見込みが低い、または害を及ぼすようなものでない限り、承認に対して強く前向きであるべきです。必要に応じて過度に一般的な名前の登録を保留することがあります。
登録を拒否する理由がある場合、専門家はその問題点を明確に示します。提案の意味論に関する助言は行えるが、それが登録をブロックしない限り明示的に示されるべきです。
要求が承認された場合、専門家は IANA に通知し、登録処理が行われます。IESG は異議の最終的な仲裁者です。
2.1.2. 拡張関係タイプ
登録を望まないアプリケーションは拡張関係タイプを使用できます。拡張関係タイプはその関係タイプを一意に識別する URI です。URI が意味論の定義を含むリソースを指すことができますが、クライアントはそのリソースを自動的に取得してはいけません(サーバーに過負荷をかけるのを避けるため)。
拡張関係タイプに使用される URI は、その定義者自身が管理するか、委任を受けていることが望ましいです。
拡張関係タイプを比較する際は、直列化が別形式の場合に URI に変換した後で、文字列として(ケースインセンシティブに)逐次比較する必要があります。このため、拡張関係にはすべて小文字の URI を使うことが望ましいです。
拡張関係タイプは URI であることが要求されますが、直列化はそれらが別の形式で表現され得ることを示してもよく、その場合は URI に変換できることが前提です。
2.2. ターゲット属性
ターゲット属性はリンクやそのターゲットを記述するキー/バリューのリストです。例えばメディアタイプのヒントなどが該当します。
これらは個々のリンク関係タイプやリンク直列化によって定義できます。
本仕様はターゲット属性の名前、基数、使用法を調整しようとするものではありません。直列化を作成・維持する者は意味や構文の衝突を避けるために協調すべきであり、独自のターゲット属性のレジストリを定義してもよいです。
ターゲット属性の名前は token ルールに準拠することが望ましいですが、可搬性のために “%”, “'”, “*” の文字を含めるべきではなく、比較はケースインセンシティブで行うべきです。
ターゲット属性の定義では次を指定することが望まれます:
- 直列化における値の Unicode への直列化(またはその部分集合)を指定し、異なる直列化間での移植性を最大化する。
- 与えられたリンクにおいてターゲット属性が複数回現れた場合の意味論とエラー処理。
本仕様は Link HTTP ヘッダフィールドで使用するためのターゲット属性を Section 3.4 で定義しています。
3. HTTP ヘッダにおけるリンクの直列化
Link ヘッダフィールドは、1 件または複数のリンクを HTTP ヘッダに直列化する手段を提供します。
フィールド値の ABNF は次の通りです:
Link = #link-value link-value = "<" URI-Reference ">" *( OWS ";" OWS link-param ) link-param = token BWS [ "=" BWS ( token / quoted-string ) ]
任意の link-param は token あるいは quoted-string のいずれの構文でも生成できることに注意してください;したがって受信者は両方の形式を解析できなければなりません。言い換えれば、次のパラメータは同等です:
x=y x="y"
以前の Link ヘッダの定義では token と quoted-string の形式を明示的に同等とはしておらず、title パラメータは常に引用され、hreflang は常に token でした。相互運用性を最大化したい送信者はそれらの形式で送るべきです。
個々の link-param は必要な unquoting(RFC7230 Section 3.2.6 に従う)の後の値に対してその構文を指定します。
本仕様は一般的リンクモデルの一部として link-params “rel”, “anchor”, “rev” を確立し、さらに直列化で定義されるターゲット属性として “hreflang”, “media”, “title”, “title*”, “type” を定義します。
3.1. リンクターゲット
各 link-value は角括弧 (“<>”) 内に URI-Reference として 1 つのターゲット IRI を伝達します(必要ならばそれを URI-Reference に変換した後;RFC3987 Section 3.1 を参照)。URI-Reference が相対的である場合、パーサは RFC3986 Section 5 に従って解決しなければなりません。メッセージ本文に現れる基底 IRI は適用されないことに注意してください。
3.2. リンクコンテキスト
デフォルトでは、Link ヘッダフィールドで伝えられるリンクのコンテキストは、そのヘッダが関連付けられている表現の URL(RFC7231 Section 3.1.4.1 で定義)であり、URI として直列化されます。
anchor パラメータが存在する場合、それはこの値を別の URI(例えばこのリソースのフラグメント、または第三のリソース)で上書きします。anchor の値が相対 URI である場合、パーサは RFC3986 Section 5 に従って解決しなければなりません。本文の基底 URI は適用されないことに注意してください。
anchor パラメータの値の ABNF は次の通りです:
URI-Reference ; Section 4.1 of [RFC3986]
リンクアプリケーションは anchor パラメータを持つリンクを無視する選択ができます。例えば、使用中のアプリケーションがリンクコンテキストを別のリソースに割り当てることを許可しない場合、そのようなリンク全体を無視すべきです;リンクアプリケーションはアンカーを適用せずにリンクを処理してはなりません。
HTTP ステータスコードやレスポンスヘッダに応じて、リンクコンテキストが「匿名」(すなわち利用可能なリンクコンテキストがない)となる場合があることに注意してください。例えば GET リクエストに対する 404 応答がその例です。
3.3. 関係タイプ
Link ヘッダフィールドで伝達されるリンクの関係タイプは “rel” パラメータの値で示されます。rel パラメータは必須ですが、同一の link-value に複数回現れてはなりません;最初の出現以降はパーサによって無視されるべきです。
ただし rel パラメータは複数のリンク関係タイプを含めることができます。これが発生した場合、それは同じコンテキスト、ターゲット、ターゲット属性を共有する複数のリンクを確立します。
過去には “rev” パラメータが関係の意味が逆方向であることを示すために使われてきました。つまり A から B への REL=”X” のリンクは、B から A への REV=”X” と同じ関係を表すということです。本仕様では rev は誤解を招くことが多いため非推奨とします。ほとんどの場合、別の関係タイプを使う方が望ましいです。
rel および rev パラメータ値の ABNF は次の通りです:
relation-type *( 1*SP relation-type )
ここで:
relation-type = reg-rel-type / ext-rel-type reg-rel-type = LOALPHA *( LOALPHA / DIGIT / "." / "-" ) ext-rel-type = URI ; Section 3 of [RFC3986]
拡張関係タイプは Link ヘッダフィールドでは絶対 URI であることが要求され、トークンで許されない文字(セミコロンやカンマなど)を含む場合は引用されなければならないことに注意してください(これらの文字はヘッダフィールド内で区切り文字として使われるため)。
3.4. ターゲット属性
Link ヘッダフィールドはこの直列化に固有の複数のターゲット属性を定義し、拡張ターゲット属性も許容します。ターゲット属性は Link ヘッダフィールド内でパラメータとして直列化されます(RFC7231 Section 3.1.1.1 の構文定義を参照)。
3.4.1. 直列化で定義される属性
“hreflang”, “media”, “title”, “title*”, “type” の各 link-param は、この直列化に定義されたターゲット属性に変換できます。
“hreflang” 属性は、リンクを逆引きした結果の言語が何であることが期待されるかを示すヒントです。これはあくまでヒントであり、例えば実際にリンクを辿って得られた HTTP レスポンスの Content-Language ヘッダフィールドを上書きするものではありません。単一の link-value に複数の hreflang 属性がある場合、示されたリソースが複数の言語を提供していることを意味します。
hreflang パラメータ値の ABNF は次の通りです:
Language-Tag
“media” 属性は、スタイル情報の想定される送信先メディアを示すために使用されます(HTML5 の該当節を参照)。値にセミコロンやカンマを含む場合は引用されなければなりません。単一の link-value に同一の media 属性が複数存在してはならず、2 番目以降はパーサによって無視されるべきです。
media パラメータ値の ABNF は次の通りです:
media-query-list
“title” 属性はリンク先を人間が読める識別子(例えばメニュー項目)としてラベル付けするために使用されます。その言語は Content-Language ヘッダ(存在する場合)によって示されます。title 属性は同一リンク内に複数出現してはならず、以降はパーサが無視します。
“title*” link-param は RFC8187 に従って異なる文字セットや言語情報を含めるために使えます。title* は同一 link-value 内に複数出現してはならず、以降はパーサが無視します。属性が言語情報を含まない場合、その言語は Content-Language ヘッダで示されます(存在する場合)。
title と title* の両方が同一リンクに存在する場合、アプリケーションは title* の値を優先してタイトル属性に使用することが推奨されます。
“type” 属性は、リンクを逆引きした結果のメディアタイプが何であることが期待されるかを示すヒントです。これもあくまでヒントであり、実際にリンクを辿って得られる HTTP レスポンスの Content-Type を上書きするものではありません。type 属性は同一リンクに複数現れてはならず、以降はパーサが無視します。
type パラメータ値の ABNF は次の通りです:
type-name "/" subtype-name ; see Section 4.2 of [RFC6838]
3.4.2. 拡張属性
その他の link-param はリンク拡張と見なされ、ターゲット属性として扱われます。
そのようなターゲット属性は RFC8187 のエンコーディング(例: “example” および “example*”)を使用するよう定義され得ます。両形式が存在する場合、それらは同一のターゲット属性とみなすべきであり、アプリケーションは “*” で終わる名前の値(RFC8187 デコード後)を使用することが推奨されますが、デコードに失敗するかデコードをサポートしていない場合には他方にフォールバックしても構いません。
3.5. Link ヘッダフィールドの例
例えば:
Link: <http://example.com/TheBook/chapter2>; rel="previous";
title="previous chapter"
これは “chapter2” が論理的なナビゲーション経路上でこのリソースの前に位置することを示します。
同様に、
Link: </>; rel="http://example.net/foo"
これはルートリソース(“/”)が拡張関係タイプ “http://example.net/foo” でこのリソースに関連していることを示します。
このリンクは:
Link: </terms>; rel="copyright"; anchor="#foo"
これはリンクされた著作権条項がドキュメントのフラグメント識別子 “foo” で示される部分にのみ適用されることを示します(メディアタイプ固有のフラグメント識別子を使用)。
以下の例は Link ヘッダフィールドで複数のリンクをエンコードする例および RFC 8187 のエンコーディングを用いて非 ASCII 文字と言語情報をエンコードする使用法を示します。
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
ここでは両方のリンクがドイツ語(“de”)で UTF-8 にエンコードされたタイトルを持ち、第二のリンクは Unicode コードポイント U+00E4(LATIN SMALL LETTER A WITH DIAERESIS)を含んでいます。
link-value は同一のリンクターゲットとコンテキストの間で複数のリンクを伝え得ることに注意してください;例えば:
Link: <http://example.org/>;
rel="start http://example.net/relation/other"
ここでは “http://example.org/” へのリンクが登録済み関係タイプ “start” と拡張関係タイプ “http://example.net/relation/other” の両方を持ちます。
最後に、このヘッダフィールド:
Link: <https://example.org/>; rel="start",
<https://example.org/index>; rel="index"
は次と同等です:
Link: <https://example.org/>; rel="start" Link: <https://example.org/index>; rel="index"
4. IANA に関する考慮事項
4.1. Link HTTP ヘッダーフィールドの登録
本仕様は HTTP の “Message Headers” レジストリにおける “Link” のエントリを本ドキュメントを参照するよう更新します(RFC3864 を参照)。
Header Field Name: Link Protocol: http Status: standard Reference: RFC 8288
4.2. リンク関係タイプレジストリ
本仕様は “Link Relation Types” レジストリの登録手順を更新します;詳細は Section 2.1.1.1 を参照してください。また、そのレジストリ内の RFC 5988 への参照は本ドキュメントへの参照に置き換えられています。
IANA はレジストリに関する問い合わせを本ドキュメントおよび(定義されている場合)専門家によって確立されたプロセスに案内します;通常これはレジストリのウェブページへの参照を意味します。
専門家はレジストリに収集する追加フィールドを定義できることに注意してください(Section 2.1.1.1 を参照)。
4.3. リンク関係アプリケーションデータレジストリ
本仕様により、IANA は “Link Relation Application Data” レジストリを削除しました。これは使用例がなく、今後の使用も見込まれないためです。
5. セキュリティに関する考慮事項
Link ヘッダフィールドの内容は安全でもプライベートでも整合性保証されているわけではありません。これらの特性を提供するエンドツーエンドの方法としては現在、HTTP における TLS(RFC2818)の使用があります。
リンクアプリケーションは、HTTP ヘッダフィールドから収集したリンクを自動的に辿ったり信頼したり利用したりすることで開く攻撃ベクトルを考慮すべきです。
例えば、Link ヘッダフィールドが anchor パラメータを用いてリンクのコンテキストを別のリソースと関連付ける場合、これは第三者による主張に過ぎず誤りや悪意のあるものになり得ます。アプリケーションはこうしたリンクを破棄するよう指定するなど、リソース間の関係(例えば同じオーソリティを共有するかどうか)が確立されていない限り受け入れないことでリスクを緩和できます。
リンクを逆引きすることはアプリケーションに応じて多くのリスクを伴います。例えば Referer ヘッダ(RFC7231)はアプリケーションの状態(プライベート情報を含む)に関する情報をその値に露出する可能性があります。同様にクッキー(RFC6265)は別の攻撃ベクトルになり得ます。アプリケーションはこれらの仕組みの操作方法を慎重に指定することでリスクを軽減できます。
Link ヘッダフィールドは IRI と URI を広く使用します。IRI に関するセキュリティ考慮については RFC3987 Section 8 を、URI に関する考慮については RFC3986 Section 7 を、HTTP ヘッダフィールドに関する考慮については RFC7230 Section 9 を参照してください。
6. 国際化に関する考慮事項
リンクターゲットは、直列化が IRI をサポートしない場合にそれらを表現するために URI に変換される必要がある場合があります。これは Link HTTP ヘッダフィールドを含みます。
同様に、Link ヘッダフィールドの anchor パラメータは IRI をサポートしないため、含める前に IRI を URI に変換する必要があります。
関係タイプは比較を容易にするために URI として定義されています。それらがエンドユーザーに表示されることは想定されていません。
登録された Relation Name は小文字の ASCII 文字である必要があることに注意してください。
7. 参考文献
7.1. 規範的参考文献
- [RFC2119]
- Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels”, BCP 14, RFC 2119, March 1997.
- [RFC3864]
- Klyne, G., Nottingham, M., and J. Mogul, “Registration Procedures for Message Header Fields”, BCP 90, RFC 3864, September 2004.
- [RFC3986]
- Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax”, STD 66, RFC 3986, January 2005.
- [RFC3987]
- Duerst, M. and M. Suignard, “Internationalized Resource Identifiers (IRIs)”, RFC 3987, January 2005.
- [RFC5234]
- Crocker, D., Ed. and P. Overell, “Augmented BNF for Syntax Specifications: ABNF”, STD 68, RFC 5234, January 2008.
- [RFC5646]
- Phillips, A., Ed. and M. Davis, Ed., “Tags for Identifying Languages”, BCP 47, RFC 5646, September 2009.
- [RFC6838]
- Freed, N., Klensin, J., and T. Hansen, “Media Type Specifications and Registration Procedures”, BCP 13, RFC 6838, January 2013.
- [RFC7230]
- Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing”, RFC 7230, June 2014.
- [RFC7231]
- Fielding, R., Ed. and J. Reschke, Ed., “Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content”, RFC 7231, June 2014.
- [RFC8126]
- Cotton, M., Leiba, B., and T. Narten, “Guidelines for Writing an IANA Considerations Section in RFCs”, BCP 26, RFC 8126, June 2017.
- [RFC8174]
- Leiba, B., “Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words”, BCP 14, RFC 8174, May 2017.
- [RFC8187]
- Reschke, J., “Indicating Character Encoding and Language for HTTP Header Field Parameters”, RFC 8187, September 2017.
- [W3C.REC-css3-mediaqueries-20120619]
- Rivoal, F., “Media Queries”, W3C Recommendation, June 2012.
7.2. 参考情報
- [RFC2046]
- Freed, N. and N. Borenstein, “Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types”, RFC 2046, November 1996.
- [RFC2818]
- Rescorla, E., “HTTP Over TLS”, RFC 2818, May 2000.
- [RFC4287]
- Nottingham, M., Ed. and R. Sayre, Ed., “The Atom Syndication Format”, RFC 4287, December 2005.
- [RFC6265]
- Barth, A., “HTTP State Management Mechanism”, RFC 6265, April 2011.
- [W3C.REC-html5-20141028]
- Hickson, I., et al., “HTML5”, W3C Recommendation, October 2014.
Appendix A. 他のリンク直列化に関する注記
ヘッダフィールド(Section 3)はリンクの直列化の一形式に過ぎず,その他の仕様が代替の直列化を定義しています。
A.1. HTML におけるリンクの直列化
HTML は Link ヘッダフィールドの元の構文に動機を与え、本書の多くの設計判断は互換性を保つことに基づいています。
HTML では link 要素は href 属性をターゲット URI に、rel 属性を関係タイプに対応させることで本仕様に示されたリンクに写像できます。リンクのコンテキストは HTML 文書全体に関連付けられた URI です。HTML は “media”, “hreflang”, “type”, “sizes” といったリンク上の属性も定義しています。
HTML5 の Section 4.8 は現代的な HTML リンクを定義します。その文書は Microformats Wiki をレジストリとして参照しています。時間をかけて、IANA レジストリはその内容を反映し最終的には置換する(HTML コミュニティ次第)ことが望まれます。
既存の HTML コンテンツの調査では、URI ではない未登録の短いリンク関係タイプが一般的であることが示されています。HTML を消費する実装はそのような未登録の短いリンクをエラーとして扱うべきではなく、その文書にローカルなスコープを持つ(すなわちその文書特有の意味を持つ)関係タイプとして扱うべきです。
最後に、HTML 仕様は “alternate” 関係タイプが他の関係タイプと同一リンク内で一致する場合に特別な意味を与えます。そのようなリンクは Link ヘッダフィールドで関係タイプの単一リスト(例: rel=”alternate stylesheet”)として直列化されるべきです。
A.2. Atom におけるリンクの直列化
Atom は atom:link 要素でリンクを伝達する直列化であり、href 属性がリンクターゲット、rel 属性が関係タイプを示します。コンテキストはフィードロケータかエントリ ID に依存し、通常フィードレベルのリンクは Link ヘッダフィールドとして送信する良い候補です。
atom:link を Link ヘッダフィールドに直列化する際には、リンクターゲットを URI に変換する必要があります。
Atom は拡張関係タイプを IRI の形で定義します。本仕様は比較を簡素化し誤りを減らすためそれらを URI として再定義します。
Atom は登録されたリンク関係タイプを “http://www.iana.org/assignments/relation/” というプレフィックスを用いて絶対 URI として直列化できるようにしています。このプレフィックスは Atom 直列化に特有のものです。
さらに、リンク関係タイプは常にケースセンシティブに比較されます。したがって、登録された関係タイプは Atom 文書に直列化する際に登録された形式(通常小文字)に変換されるべきです。
また、Link ヘッダフィールドは単一の link-value に複数の関係を直列化できるのに対し、atom:link はそうではありません。この場合、単一の link-value は複数の atom:link 要素にマップされ得ます。
HTML と同様に、atom:link は Link ヘッダ構文に明示的に反映されない属性をいくつか定義しますが、それらはリンク拡張として使用して忠実性を保つことができます。
Appendix B. Link ヘッダーフィールドを解析するアルゴリズム
この付録は非規範的な一連のアルゴリズムを概説します:ヘッダセットから Link ヘッダを抽出して解析する方法、Link ヘッダフィールド値を解析する方法、およびフィールド値の一般的な部分を解析するためのアルゴリズムです。
これらのアルゴリズムは ABNF が示唆するよりも寛容であり、それに内在するエラー処理は妥当なアプローチですが必須ではありません。したがって助言的なものにすぎず、意見が分かれる場合は本仕様の本文が正しい挙動を定義します。
B.1. リンクのためのヘッダセットを解析する
このアルゴリズムは HTTP ヘッダセットに含まれる Link ヘッダフィールドを解析するために使用できます。header_set を(field_name, field_value)のペアリストと仮定すると(ASCII エンコーディング)、リンクオブジェクトのリストを返します。
- field_values を header_set のメンバのうち field_name が “link” と大文字小文字を区別せず一致するもののリストとする。
- links を空のリストとする。
- 各 field_value について:
- value_links を「リンクフィールド値を解析する」(Appendix B.2)を field_value から実行した結果とする。
- value_links の各メンバを links に追加する。
- links を返す。
B.2. リンクフィールド値を解析する
このアルゴリズムは Link ヘッダフィールドからゼロ個以上のカンマ区切りの link-value を解析します。ASCII 文字列 field_value を受け取り、リンクオブジェクトのリストを返します。
- links を空のリストとする。
- field_value に内容がある間:
- 先行する OWS を消費する。
- 最初の文字が “<” でない場合、links を返す。
- 先頭の文字 “<” を破棄する。
- 最初の “>” 文字または field_value の終端までを消費し、その結果を target_string とする。
- 次の文字が “>” でない場合、links を返す。
- 先頭の “>” を破棄する。
- link_parameters を「パラメータを解析する」(Appendix B.3)を field_value から実行した結果とする(ゼロ個以上の文字を消費する)。
- target_uri を target_string を相対解決(RFC3986 Section 5.2)した結果とする。本文の基底 URI は使用しない。
- relations_string を、link_parameters の最初のタプルでその最初の要素が “rel” に一致するものの第二要素、または存在しない場合は空文字列とする。
- relations_string を RWS で分割し、relation_types の文字列リストを得る(RWS を除去する)。
- context_string を、link_parameters の最初のタプルでその最初の要素が “anchor” に一致するものの第二要素とする。存在しない場合、context_string は Link ヘッダを保持する表現の URL(RFC7231 Section 3.1.4.1)を URI として直列化したものとする。URL が匿名の場合、context_string は null とする。
- context_uri を context_string を相対解決(RFC3986 Section 5.2)した結果とする。context_string が null の場合は context_uri は null とする。本文の基底 URI は使用しない。
- target_attributes を空のリストとする。
- link_parameters の各タプル (param_name, param_value) について:
- param_name が “rel” または “anchor” に一致する場合はそのタプルをスキップする。
- param_name が “media”, “title”, “title*” または “type” に一致し、かつ target_attributes が既に同名のタプルを含む場合、そのタプルをスキップする。
- (param_name, param_value) を target_attributes に追加する。
- star_param_names を、link_parameters のタプルのうち param_name の最後の文字が “*” であるものの param_name の集合とする。
- 各 star_param_name について:
- base_param_name を star_param_name の最後の文字を削除したものとする。
- 実装が base_param_name の国際化形式をサポートしない場合(仕様により禁止されている等を含むがこれに限定されない)、link_parameters から first member が star_param_name のすべてのタプルを削除し、次の star_param_name に進む。
- link_parameters から first member が base_param_name のすべてのタプルを削除する。
- link_parameters 内で first member が star_param_name のすべてのタプルの first member を base_param_name に変更する。
- 各 relation_type について:
- relation_type を小文字に正規化する。
- target が target_uri、relation type が relation_type、context が context_uri、target attributes が target_attributes のリンクオブジェクトを links に追加する。
- links を返す。
B.3. パラメータを解析する
このアルゴリズムはヘッダフィールド値からパラメータを解析します。ASCII 文字列 input を受け取り、それが含む (parameter_name, parameter_value) タプルのリストを返します。input は解析されたパラメータを削除する形で変更されます。
- parameters を空のリストとする。
- input に内容がある間:
- 先行する OWS を消費する。
- 最初の文字が “;” でない場合、parameters を返す。
- 先頭の “;” を破棄する。
- 先行する OWS を消費する。
- 最初の BWS, “=”, “;”, “,” のいずれかの文字または入力の終端までを消費し、その結果を parameter_name とする。
- 先行する BWS を消費する。
- 次の文字が “=” の場合:
- 先頭の “=” を破棄する。
- 先行する BWS を消費する。
- 次の文字が DQUOTE の場合、parameter_value を「引用文字列を解析する」(Appendix B.4)を input から実行した結果とする(ゼロ個以上の文字を消費する)。
- それ以外の場合、最初の “;” または “,” のいずれかの文字、または入力終端までを消費し、その結果を parameter_value とする。
- parameter_name の最後の文字が “*” である場合、parameter_value を RFC8187 に従ってデコードする。回復不能なエラーが発生しても処理を続行する。
- それ以外:
- parameter_value を空文字列とする。
- parameter_name を小文字に正規化する。
- (parameter_name, parameter_value) を parameters に追加する。
- 先行する OWS を消費する。
- 次の文字が “,” または入力終端であれば、処理を停止して parameters を返す。
B.4. 引用文字列を解析する
このアルゴリズムは引用文字列を RFC7230 Section 3.2.6 に従って解析します。ASCII 文字列 input を受け取り、引用解除された文字列を返します。input は解析された文字列を削除する形で変更されます。
- output を空文字列とする。
- input の最初の文字が DQUOTE でない場合、output を返す。
- 最初の文字を破棄する。
- input に内容がある間:
- 最初の文字がバックスラッシュ (“\”) の場合:
- 最初の文字を破棄する。
- それ以上入力がなければ output を返す。
- それ以外なら、最初の文字を消費して output に追加する。
- 最初の文字が DQUOTE の場合、それを破棄して output を返す。
- それ以外の場合、最初の文字を消費して output に追加する。
- 最初の文字がバックスラッシュ (“\”) の場合:
- output を返す。
Appendix C. RFC 5988 からの変更
本仕様は先行文書 RFC 5988 から次の変更を含んでいます:
- 初期の関係タイプ登録は削除されました(既に RFC 5988 によって登録されているため)。
- 序文が短縮されました。
- “Link Relation Application Data” レジストリが削除されました。
- 訂正(errata)が取り込まれました。
- 参照が更新されました。
- リンクの基数に関する説明が明確化されました。
- 用語が “target IRI” / “context IRI” から “link target” / “link context” に変更されました。
- 登録済み関係タイプへの URI 割当が直列化固有になりました。
- Link ヘッダフィールドが HTML および Atom のリンクと意味的に同等であるという誤解を招く表現を削除しました。
- “link serialisations” と “link applications” の用語をより慎重に定義して使用しました。
- ターゲット属性の基数(一般的および “type” に関して)を明確化しました。
- Link ヘッダのデフォルトのリンクコンテキストを RFC 7231 に従って表現の識別に依存するよう修正しました。
- Link ヘッダのパースアルゴリズムを提案しました。
- ターゲット属性の値空間と定義が指定されました。
- ABNF が RFC7230 と互換になるよう更新され、特に空白が明示されました。
- HTTP ヘッダ上の一部パラメータは token として現れ得るようになりました。
- HTTP ヘッダ上のパラメータは値無しでも現れ得るようになりました。
- 引用文字列の扱いは RFC7230 により定義されるようになりました。
- type ヘッダパラメータは現在、(token が “/” を許さないため)引用される必要があることになりました。