跳到主要内容

5. Link 头字段

Link 实体头字段提供了一种在 HTTP 头中序列化一条或多条链接的方式. 它在语义上等同于 HTML 中的 元素, 以及 Atom [RFC4287] 中的 atom:link feed 级元素.

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 都在尖括号 ("<>") 内以 URI-Reference 的形式 (如有必要, 先转换为 URI-Reference; 见 [RFC3987] 第 3.1 节) 传递一个目标 IRI. 如果该 URI-Reference 是相对的, 解析器 MUST 按 [RFC3986] 第 5 节解析它. 注意, 来自消息内容的任何基准 IRI 都不适用.

5.2. 上下文 IRI​

默认情况下, Link 头字段中传递的链接的上下文是被请求资源的 IRI.

当 anchor 参数存在时, 它用另一个 URI 覆盖该上下文, 例如本资源的一个片段, 或第三个资源 (即当 anchor 值为绝对 URI 时). 如果 anchor 参数的值是相对 URI, 解析器 MUST 按 [RFC3986] 第 5 节解析它. 注意, 来自正文内容的任何基准 URI 都不适用.

消费实现可以选择忽略带有 anchor 参数的链接. 例如, 正在使用的应用可能不允许把上下文 IRI 指派给另一个资源. 在这种情况下, 应当忽略整条链接; 消费实现 MUST NOT 在不应用 anchor 的情况下处理该链接.

注意, 取决于 HTTP 状态码和响应头, 上下文 IRI 可能是 "anonymous" 的 (即没有可用的上下文 IRI). 例如, 对 GET 请求返回 404 响应时就是这种情况.

5.3. 关系类型​

链接的关系类型由 "rel" 参数的值传递. "rel" 参数在一个给定的 link-value 中 MUST NOT 出现多次; 解析器 MUST 忽略第一次之后的出现.

"rev" 参数过去被用来表示关系的语义方向是相反的. 也就是说, 从 A 到 B 且 REL="X" 的链接所表达的关系, 与从 B 到 A 且 REV="X" 的链接相同. "rev" 被本规范弃用, 因为它常常使作者和读者困惑; 在大多数情况下, 使用单独的关系类型更为可取.

注意, 扩展关系类型在 Link 头中 REQUIRED 为绝对 URI, 并且如果它们包含分号 (";") 或逗号 (",") 则 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] 更新). 如果其值包含分号 (";") 或逗号 (","), 则 MUST 加引号, 并且一个 link-value 中 MUST NOT 有多于一个 "media" 参数.

"title" 参数存在时, 用于为链接的目标加标签, 使其可以按 Content-Language 头 (如果存在) 所指示的语言用作人类可读的标识符 (例如菜单项). "title" 参数在一个给定的 link-value 中 MUST NOT 出现多次; 解析器 MUST 忽略第一次之后的出现.

"title*" 参数可用于以不同的字符集编码该标签, 和/或按 [RFC5987] 包含语言信息. "title*" 参数在一个给定的 link-value 中 MUST NOT 出现多次; 解析器 MUST 忽略第一次之后的出现. 如果该参数不包含语言信息, 则其语言由 Content-Language 头 (当存在时) 指示.

如果 "title" 和 "title*" 参数同时出现在一个 link-value 中, 处理者 SHOULD 使用 "title*" 参数的值.

"type" 参数存在时, 是一个提示, 指示解引用该链接所得结果的媒体类型应当是什么. 注意这只是一个提示; 例如, 它不会覆盖实际跟随该链接所得到的 HTTP 响应的 Content-Type 头. 一个 link-value 中 MUST NOT 有多于一个 type 参数.

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 头编码多条链接的一个实例, 也展示了使用 RFC 2231 编码来同时编码非 ASCII 字符和语言信息.

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 之间传递多条链接; 例如:

    Link: <http://example.org/>;
rel="start http://example.net/relation/other"

这里, 指向 "http://example.org/" 的链接具有已注册关系类型 "start" 和扩展关系类型 "http://example.net/relation/other".