Apache 模块 mod_negotiation

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

Summary

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

Type maps

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

Example

Content-Type: image/jpeg; qs=0.8

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

首页