Apache HTTP Server 版本 2.4
描述 | 提供 内容协商 |
---|---|
状态 | 基础 |
模块标识符 | negotiation_module |
源文件 | mod_negotiation.c |
内容协商,更准确地说应该是内容选择,是从多个可用文档中选择最符合客户端功能的文档。这有两种实现方式。
type-map
的文件),它显式列出包含变体的文件。Multiviews
Options
启用),服务器会进行隐式文件名模式匹配,并从结果中进行选择。类型映射的格式类似于 RFC822 邮件头。它包含由空行分隔的文档描述,以井号 ('#') 开头的行被视为注释。文档描述包含多个头记录;如果续行以空格开头,则记录可以跨多行继续。开头的空格将被删除,并将行连接起来。头记录包含一个关键字名称,它始终以冒号结尾,后面跟着一个值。在头名称和值之间以及值中的标记之间允许使用空格。允许的头包括
Content-Encoding
AddEncoding
指令定义的编码。这通常包括用于压缩文件的 x-compress
编码和用于 gzip 文件的 x-gzip
编码。x-
前缀在编码比较中被忽略。Content-Language
en
,表示英语。如果变体包含多种语言,则用逗号分隔。Content-Length
Content-Type
name=value
。常见参数包括level
text/html
,默认值为 2,否则为 0。qs
qs
值都特定于给定资源。Content-Type: image/jpeg; qs=0.8
URI
Body
Body:----xyz----
<html>
<body>
<p>页面的内容。</p>
</body>
</html>
----xyz----
例如,考虑一个名为 document.html
的资源,它以英语、法语和德语提供。每个文件分别称为 document.html.en
、document.html.fr
和 document.html.de
。类型映射文件将被称为 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
请求头中指定的语言首选项的变体。
如果启用了 Multiviews
,并且 MultiviewsMatch
设置为“handlers”或“any”,则对 document.html
的请求将发现 document.html.var
并继续与显式类型映射协商。
其他配置指令,如 Alias
可用于将 document.html
映射到 document.html.var
。
多视图搜索由 Multiviews
Options
启用。如果服务器收到对 /some/dir/foo
的请求,并且 /some/dir/foo
*不存在*,则服务器会读取目录以查找所有名为 foo.*
的文件,并有效地伪造一个类型映射,该映射命名所有这些文件,并为它们分配与客户端请求其中一个文件时相同的媒体类型和内容编码。然后,它会选择最符合客户端要求的匹配项,并返回该文档。
MultiviewsMatch
指令配置 Apache 在选择文件时是否会考虑没有为其分配内容协商元信息的那些文件。
描述 | 允许代理服务器缓存内容协商的文档 |
---|---|
语法 | CacheNegotiatedDocs On|Off |
默认 | CacheNegotiatedDocs Off |
上下文 | 服务器配置,虚拟主机 |
状态 | 基础 |
模块 | mod_negotiation |
如果设置,此指令允许代理服务器缓存内容协商的文档。这意味着那些代理后面的客户端可能会检索到与他们的功能不匹配的文档版本,但这将使缓存更有效。
此指令仅适用于来自 HTTP/1.0 浏览器的请求。HTTP/1.1 提供了对协商文档缓存的更好控制,并且此指令对对 HTTP/1.1 请求的响应没有影响。
描述 | 如果找不到单个可接受的文档,则采取的操作 |
---|---|
语法 | ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback] |
默认 | ForceLanguagePriority Prefer |
上下文 | 服务器配置,虚拟主机,目录,.htaccess |
覆盖 | FileInfo |
状态 | 基础 |
模块 | mod_negotiation |
ForceLanguagePriority
指令使用给定的 LanguagePriority
来满足协商,否则服务器可能无法返回单个匹配的文档。
ForceLanguagePriority Prefer
使用 LanguagePriority
来提供一个有效的结果,而不是在有多个同样有效的选择时返回 HTTP 结果 300(多个选择)。如果给出以下指令,并且用户的 Accept-Language
头将 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
的第一个匹配变体,或者如果没有任何变体与客户端的可接受语言列表匹配,则将提供第一个可用文档。
描述 | 在客户端没有表达偏好时,语言变体的优先级 |
---|---|
语法 | LanguagePriority MIME-lang [MIME-lang] ... |
上下文 | 服务器配置,虚拟主机,目录,.htaccess |
覆盖 | FileInfo |
状态 | 基础 |
模块 | mod_negotiation |
LanguagePriority
设置在客户端没有表达偏好时,处理多视图请求时语言变体的优先级。MIME-lang 列表按优先级递减排序。
LanguagePriority en fr de
对于对 foo.html
的请求,其中 foo.html.fr
和 foo.html.de
都存在,但浏览器没有表达语言偏好,则将返回 foo.html.fr
。
请注意,此指令仅在无法通过其他任何方式确定“最佳”语言或 ForceLanguagePriority
指令不是 None
时才有效。一般来说,客户端决定语言偏好,而不是服务器。