Apache 模块 mod_negotiation

Description:提供content negotiation
Status:Base
Module Identifier:negotiation_module
Source File:mod_negotiation.c

Summary

内容协商,或更准确地说是内容选择,是从多个可用文档之一中选择最匹配 Client 端功能的文档。有两种实现。

  • 类型 Map(带有处理程序type-map的文件)明确列出包含变体的文件。

  • 多视图搜索(由Multiviews Options启用),其中服务器执行隐式文件名模式匹配,然后从结果中进行选择。

Type maps

类型 Map 的格式类似于 RFC822 邮件头。它包含用空行分隔的文档描述,其中以井号('#')开头的行被视为 Comments。文档描述由几个标题记录组成;如果连续行以空格开头,则记录可以在多行上 continue。前导空格将被删除,行将被连接。Headers 记录由关键字名组成,关键字名总是以冒号结尾,后跟一个值。Headers 名称和值之间以及值的标记之间允许使用空格。允许的标题为:

  • Content-Encoding:

    • 文件的编码。 Apache 仅识别由AddEncoding指令定义的编码。这通常包括用于 zipfile 的编码x-compress和用于 gzip 文件的编码x-gzipx-前缀被忽略以进行编码比较。
  • Content-Language:

    • 变体的一种或多种语言,作为 Internet 标准语言标记(RFC 1766)。例如en,意思是英语。如果变体包含多种语言,则用逗号分隔。
  • Content-Length:

    • 文件的长度,以字节为单位。如果不存在此 Headers,则使用文件的实际长度。
  • Content-Type:

    • 文档的MIME 媒体类型,带有可选参数。参数与媒体类型分隔,并以分号分隔,语法为name=value。常用参数包括:
  • level

    • 一个整数,指定媒体类型的版本。对于text/html,默认为 2,否则为 0.

    • qs

      • 一个浮点数,其值在 0 [.000]到 1 [.000]的范围内,指示此变体与其他可用变体相比的相对“质量”,而与 Client 端的功能无关。例如,如果 jpeg 文件试图代表照片,则其源质量通常高于 ASCII 文件。但是,如果所表示的资源是 ascii art,则 ascii 文件将比 jpeg 文件具有更高的源质量。因此,所有qs值都特定于给定资源。

Example

Content-Type: image/jpeg; qs=0.8

  • URI:

    • 包含变体的文件 uri(给定媒体类型的变种,使用给定内容编码进行编码)。这些被解释为相对于 Map 文件的 URL。它们必须位于同一服务器上,并且必须引用如果直接请求 Client 端将被授予访问权限的文件。
  • Body:

    • 资源的实际内容可以使用 Body Headers 包含在类型 Map 文件中。该 Headers 必须包含一个字符串,用于指定正文内容的定界符。然后,在找到分隔符字符串之前,类型 Map 文件中的所有后续行都将被视为资源主体的一部分。

Example:

Body:----xyz---- <html> <body> <p>Content of the page.</p> </body> </html> ----xyz----

例如,考虑一个名为document.html的资源,该资源以英语,法语和德语提供。这些文件的文件分别称为document.html.endocument.html.frdocument.html.de。类型 Map 文件将称为document.html.var,并将包含以下内容:

URI: document.html Content-language: en Content-type: text/html URI: document.html.en Content-language: fr Content-type: text/html URI: document.html.fr Content-language: de Content-type: text/html URI: document.html.de

所有这四个文件应放在同一目录中,并且.var文件应通过AddHandler指令与type-map处理程序关联:

AddHandler type-map .var

在此目录中对document.html.var的请求将导致选择最匹配用户Accept-Language请求 Headers 中指定的语言首选项的变体。

如果启用了Multiviews,并且将MultiviewsMatch设置为“处理程序”或“任何”,则对document.html的请求将发现document.html.var并 continue 与显式类型 Map 进行协商。

其他配置指令(例如Alias)可用于将document.htmlMap 到document.html.var

Multiviews

Multiviews Options启用了多视图搜索。如果服务器收到对/some/dir/foo的请求,而/some/dir/foo不存在,则服务器读取目录以查找名为foo.*的所有文件,并有效地伪造一个类型 Map,该 Map 将所有这些文件命名,并为它们分配相同的媒体类型和内容-编码,如果 Client 端按名称要求其中之一。然后,它选择最符合 Client 要求的匹配项,并返回该文档。

MultiviewsMatch指令配置 Apache 在选择文件时是否将考虑未分配内容协商元信息的文件。

CacheNegotiatedDocs Directive

Description:允许通过内容协商的文档由代理服务器缓存
Syntax:CacheNegotiatedDocs On|Off
Default:CacheNegotiatedDocs Off
Context:服务器配置,虚拟主机
Status:Base
Module:mod_negotiation

如果设置,此指令允许代理服务器缓存内容协商的文档。这可能意味着这些代理后面的 Client 可以检索与其功能最不匹配的文档版本,但这将使缓存效率更高。

该指令仅适用于来自 HTTP/1.0 浏览器的请求。 HTTP/1.1 对协商的文档的缓存提供了更好的控制,并且此指令对 HTTP/1.1 请求的响应无效。

ForceLanguagePriority Directive

Description:如果找不到单个可接受的文档,应采取的措施
Syntax:ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]
Default:ForceLanguagePriority Prefer
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_negotiation

ForceLanguagePriority指令使用给定的LanguagePriority来满足协商,否则服务器将无法返回单个匹配的文档。

ForceLanguagePriority Prefer使用LanguagePriority来提供一个有效的结果,而不是在存在多个同样有效的选择时返回 HTTP 结果 300(MULTIPLE CHOICES)。如果给出了以下指令,并且用户的Accept-LanguageHeaders 将ende分别指定为质量.500(同样可以接受),则将提供第一个匹配变体en

LanguagePriority en fr de
ForceLanguagePriority Prefer

ForceLanguagePriority Fallback使用LanguagePriority来提供有效的结果,而不是返回 HTTP 结果 406(无法接受)。如果给出了以下指令,并且用户的Accept-Language仅允许使用es语言响应,但未找到这样的变体,则将提供下面LanguagePriority列表中的第一个变体。

LanguagePriority en fr de
ForceLanguagePriority Fallback

可以同时指定PreferFallback两个选项,因此,如果可接受多个变量,则将提供LanguagePriority的第一个匹配变量,或者如果没有一个变量与 Client 的可接受语言列表匹配,则将提供第一个可用的文档。

See also

LanguagePriority Directive

Description:在 Client 端不表达偏好的情况下语言变体的优先级
Syntax:LanguagePriority MIME-lang [MIME-lang] ...
Context:服务器配置,虚拟主机,目录,.htaccess
Override:FileInfo
Status:Base
Module:mod_negotiation

LanguagePriority设置了在处理 Multiviews 请求时 Client 端不表达偏好的情况下语言变体的优先级。 MIME-lang 的列表按优先级递减的 Sequences 排列。

LanguagePriority en fr de

对于foo.html的请求,其中foo.html.frfoo.html.de都存在,但浏览器未表达语言偏好,则将返回foo.html.fr

请注意,仅当无法通过任何其他方式确定“最佳”语言或ForceLanguagePriority指令不是None时,此指令才有效。通常,Client 端确定语言首选项,而不是服务器。

See also