On this page
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-gzip
。x-
前缀被忽略以进行编码比较。
- 文件的编码。 Apache 仅识别由AddEncoding指令定义的编码。这通常包括用于 zipfile 的编码
Content-Language:
- 变体的一种或多种语言,作为 Internet 标准语言标记(RFC 1766)。例如
en
,意思是英语。如果变体包含多种语言,则用逗号分隔。
- 变体的一种或多种语言,作为 Internet 标准语言标记(RFC 1766)。例如
Content-Length:
- 文件的长度,以字节为单位。如果不存在此 Headers,则使用文件的实际长度。
Content-Type:
- 文档的MIME 媒体类型,带有可选参数。参数与媒体类型分隔,并以分号分隔,语法为
name=value
。常用参数包括:
- 文档的MIME 媒体类型,带有可选参数。参数与媒体类型分隔,并以分号分隔,语法为
level
一个整数,指定媒体类型的版本。对于
text/html
,默认为 2,否则为 0.qs
- 一个浮点数,其值在 0 [.000]到 1 [.000]的范围内,指示此变体与其他可用变体相比的相对“质量”,而与 Client 端的功能无关。例如,如果 jpeg 文件试图代表照片,则其源质量通常高于 ASCII 文件。但是,如果所表示的资源是 ascii art,则 ascii 文件将比 jpeg 文件具有更高的源质量。因此,所有
qs
值都特定于给定资源。
- 一个浮点数,其值在 0 [.000]到 1 [.000]的范围内,指示此变体与其他可用变体相比的相对“质量”,而与 Client 端的功能无关。例如,如果 jpeg 文件试图代表照片,则其源质量通常高于 ASCII 文件。但是,如果所表示的资源是 ascii art,则 ascii 文件将比 jpeg 文件具有更高的源质量。因此,所有
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.en
,document.html.fr
和document.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.html
Map 到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-Language
Headers 将en
和de
分别指定为质量.500
(同样可以接受),则将提供第一个匹配变体en
。
LanguagePriority en fr de
ForceLanguagePriority Prefer
ForceLanguagePriority Fallback
使用LanguagePriority来提供有效的结果,而不是返回 HTTP 结果 406(无法接受)。如果给出了以下指令,并且用户的Accept-Language
仅允许使用es
语言响应,但未找到这样的变体,则将提供下面LanguagePriority列表中的第一个变体。
LanguagePriority en fr de
ForceLanguagePriority Fallback
可以同时指定Prefer
和Fallback
两个选项,因此,如果可接受多个变量,则将提供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.fr
和foo.html.de
都存在,但浏览器未表达语言偏好,则将返回foo.html.fr
。
请注意,仅当无法通过任何其他方式确定“最佳”语言或ForceLanguagePriority指令不是None
时,此指令才有效。通常,Client 端确定语言首选项,而不是服务器。