5. Link ヘッダーフィールド
Link エンティティヘッダーフィールドは、HTTP ヘッダーにおいて一つ以上のリンクをシリアライズする手段を提供します。これは、HTML の 要素、および Atom [RFC4287] の atom:link フィードレベル要素と意味的に等価です。
Link = "Link" ":" #link-value
link-value = "<" URI-Reference ">" *( ";" link-param )
link-param = ( ( "rel" "=" relation-types )
| ( "anchor" "=" <"> URI-Reference <"> )
| ( "rev" "=" relation-types )
| ( "hreflang" "=" Language-Tag )
| ( "media" "=" ( MediaDesc | ( <"> MediaDesc <"> ) ) )
| ( "title" "=" quoted-string )
| ( "title*" "=" ext-value )
| ( "type" "=" ( media-type | quoted-mt ) )
| ( link-extension ) )
link-extension = ( parmname [ "=" ( ptoken | quoted-string ) ] )
| ( ext-name-star "=" ext-value )
ext-name-star = parmname "*" ; reserved for RFC2231-profiled
; extensions. Whitespace NOT
; allowed in between.
ptoken = 1*ptokenchar
ptokenchar = "!" | "#" | "$" | "%" | "&" | "'" | "("
| ")" | "*" | "+" | "-" | "." | "/" | DIGIT
| ":" | "<" | "=" | ">" | "?" | "@" | ALPHA
| "[" | "]" | "^" | "_" | "`" | "{" | "|"
| "}" | "~"
media-type = type-name "/" subtype-name
quoted-mt = <"> media-type <">
relation-types = relation-type
| <"> relation-type *( 1*SP relation-type ) <">
relation-type = reg-rel-type | ext-rel-type
reg-rel-type = LOALPHA *( LOALPHA | DIGIT | "." | "-" )
ext-rel-type = URI
5.1. ターゲット IRI
各 link-value は、山括弧 ("<>") の内部に、一つのターゲット IRI を URI-Reference として伝えます(必要であれば変換した上で。[RFC3987] の 3.1 節を参照)。URI-Reference が相対である場合、パーサーは [RFC3986] の 5 節に従ってそれを解決しなければなりません (MUST)。メッセージのコンテンツからのベース IRI は適用されないことに注意してください。
5.2. コンテキスト IRI
デフォルトでは、Link ヘッダーフィールドで伝えられるリンクのコンテキストは、リクエストされたリソースの IRI です。
anchor パラメーターが存在する場合、それはこれを別の URI、例えばこのリソースのフラグメント、あるいは(anchor の値が絶対 URI である場合は)第三のリソースで上書きします。anchor パラメーターの値が相対 URI である場合、パーサーは [RFC3986] の 5 節に従ってそれを解決しなければなりません (MUST)。本文のコンテンツからのベース URI は適用されないことに注意してください。
消費側の実装は、anchor パラメーターを持つリンクを無視することを選択できます。例えば、使用中のアプリケーションが、コンテキスト IRI を別のリソースに割り当てることを許可しない場合があります。そのような場合、リンク全体が無視されることになります。消費側の実装は、anchor を適用せずにそのリンクを処理してはなりません (MUST NOT)。
HTTP ステータスコードとレスポンスヘッダーによっては、コンテキスト IRI が「匿名」になる場合(すなわち、利用可能なコンテキスト IRI が存在しない場合)があることに注意してください。例えば、GET リクエストに対する 404 レスポンスの場合がこれに該当します。
5.3. 関係タイプ
リンクの関係タイプは、"rel" パラメーターの値で伝えられます。"rel" パラメーターは、与えられた link-value に複数回現れてはならず (MUST NOT)、最初の出現より後のものはパーサーによって無視されなければなりません (MUST)。
"rev" パラメーターは、関係のセマンティクスが逆方向であることを示すために過去に使用されていました。すなわち、REL="X" を持つ A から B へのリンクは、REV="X" を持つ B から A へのリンクと同じ関係を表現します。"rev" は、著者と読者をしばしば混乱させるため、本仕様によって非推奨とされています。ほとんどの場合、別の関係タイプを使用する方が望ましいです。
拡張関係タイプは、Link ヘッダーにおいて絶対 URI であることが REQUIRED であり、セミコロン (";") またはカンマ (",") を含む場合は引用符で囲まれなければならない (MUST) ことに注意してください(これらの文字はヘッダー自体で区切り文字として使用されるためです)。
5.4. ターゲット属性
"hreflang"、"media"、"title"、"title*"、"type"、および任意の link-extension link-param は、そのリンクのターゲット属性と見なされます。
"hreflang" パラメーターは、存在する場合、リンクを逆参照した結果の言語が何であるべきかについてのヒントです。これは単なるヒントであることに注意してください。例えば、実際にリンクをたどって得られた HTTP レスポンスの Content-Language ヘッダーを上書きするものではありません。単一の link-value に複数の "hreflang" パラメーターがある場合、示されたリソースから複数の言語が利用可能であることを示します。"media" パラメーターは、存在する場合、スタイル情報の意図された宛先媒体またはメディアを示すために使用されます([W3C.REC-html401-19991224] の 6.13 節を参照)。これは [W3C.CR-css3-mediaqueries-20090915] によって更新される可能性があることに注意してください。"media" の値は、セミコロン (";") またはカンマ (",") を含む場合、引用符で囲まれなければならず (MUST)、link-value 内に複数の "media" パラメーターがあってはなりません (MUST NOT)。
"title" パラメーターは、存在する場合、(存在するならば)Content-Language ヘッダーで示される言語で、人間が読める識別子(例えばメニュー項目)として使用できるようにリンクの宛先にラベルを付けるために使用されます。"title" パラメーターは、与えられた link-value に複数回現れてはならず (MUST NOT)、最初の出現より後のものはパーサーによって無視されなければなりません (MUST)。
"title*" パラメーターは、このラベルを異なる文字集合で符号化するため、および/または [RFC5987] に従って言語情報を含めるために使用できます。"title*" パラメーターは、与えられた link-value に複数回現れてはならず (MUST NOT)、最初の出現より後のものはパーサーによって無視されなければなりません (MUST)。そのパラメーターが言語情報を含まない場合、その言語は(存在するならば)Content-Language ヘッダーによって示されます。
"title" と "title*" の両方のパラメーターが link-value に現れる場合、プロセッサーは "title*" パラメーターの値を使用すべきです (SHOULD)。
"type" パラメーターは、存在する場合、リンクを逆参照した結果のメディアタイプが何であるべきかについてのヒントです。これは単なるヒントであることに注意してください。例えば、実際にリンクをたどって得られた HTTP レスポンスの Content-Type ヘッダーを上書きするものではありません。link-value 内に複数の type パラメーターがあってはなりません (MUST NOT)。
5.5. 例
例えば:
Link: <http://example.com/TheBook/chapter2>; rel="previous";
title="previous chapter"
これは、"chapter2" が論理的なナビゲーション経路においてこのリソースより前にあることを示します。
同様に、
Link: </>; rel="http://example.net/foo"
これは、ルートリソース ("/") が拡張関係タイプ "http://example.net/foo" でこのリソースと関係していることを示します。以下の例は、Link ヘッダーが複数のリンクを符号化するインスタンス、および非 ASCII 文字と言語情報の両方を符号化するための RFC 2231 符号化の使用を示しています。
Link: </TheBook/chapter2>;
rel="previous"; title*=UTF-8'de'letztes%20Kapitel,
</TheBook/chapter4>;
rel="next"; title*=UTF-8'de'n%c3%a4chstes%20Kapitel
ここでは、両方のリンクのタイトルが UTF-8 で符号化され、ドイツ語 ("de") を使用しており、二番目のリンクには Unicode コードポイント U+00E4("LATIN SMALL LETTER A WITH DIAERESIS")が含まれています。
link-value は、同じターゲット IRI とコンテキスト IRI の間の複数のリンクを伝えることができることに注意してください。例えば:
Link: <http://example.org/>;
rel="start http://example.net/relation/other"
ここでは、"http://example.org/" へのリンクは、登録済み関係タイプ "start" と拡張関係タイプ "http://example.net/relation/other" を持っています。