💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Apache模块 mod_negotiation | [说明](#calibre_link-11) | 提供[内容协商](#calibre_link-258)支持 | | --- | --- | | [状态](#calibre_link-12) | 基本(B) | | [模块名](#calibre_link-13) | negotiation_module | | [源文件](#calibre_link-14) | mod_negotiation.c | ### 概述 内容协商,更准确的说应该是"内容选择",是从几个有效文档中选择一个最匹配客户端要求的文档的过程。内容协商有两种实现方法。 * 使用类型表(一个包含`type-map`处理器信息的文件)明确地列出各变种的文件名。 * 使用"MultiViews"搜索(由`Options`指令中的`MultiViews`选项激活),即服务器执行一个隐含的文件名模式匹配,并在结果中选择。 ## 类型表 类型表的格式有点类似于RFC822邮件头的格式。它包含以空行分格的文档描述,以井号(#)打头的行被当作是注释。一个文档描述包含几个头记录,以空格开始的行将被认为是前一行的延续,这样文档描述记录就可以包含多行。在处理处理多行记录时,行与行被连接起来,打头的空格会被删除。一个头记录包含一个关键字名,并且总是在结尾的地方用一个冒号将它自己和紧跟其后的值分隔开。在头名字与它的值之间以及取值的各个标记之间可以插入空格。头可以是: `Content-Encoding:` 文件的编码方式。Apache只支持用`AddEncoding`指令定义的编码方式。它一般包含compress压缩文件的`x-compress`编码和gzip文件的`x-gzip`编码。在编码对照过程中,"`x-`"前缀会被忽略。 `Content-Language:` 按互联网标准语言标签([RFC 1766](http://www.ietf.org/rfc/rfc1766.txt))定义的变体语言。举例来说`en`表示英语。如果变体包含一种以上的语言,用逗号来分隔。 `Content-Length:` 以字节为单位的文件长度。如果这个头不存在,则使用文件的实际长度。 `Content-Type:` 带可选参数的文档[MIME类型](#calibre_link-223 "see glossary")。参数与MIME类型之间以及参数之间都用分号分隔,参数使用类似"`name=value`"这样的语法。参数包括: `level` 一个指明媒体类型版本的整数。对`text/html`来讲,默认值是"2",其它的默认值为"0"。 `qs` 一个取值在0.0到1.0之间的浮点数,它表示在不考虑客户端性能的情况下,一个变体相对于其它变体的"品质"。比如在表现一张照片时,jpeg文件通常比字符构图有较高的还原品质;而如果要表现的本来就是一个字符构图,那么当然Ascii文件会比jpeg文件有较高的还原品质。因此,所有的`qs`取值都是特定于某个资源的。 ### 示例 ``` Content-Type: image/jpeg; qs=0.8 ``` `URI:` 文件的URI包含了媒体类型、编码方式等变量的信息,这些被解释为与映射文件相关的URL ,它们必须在**同一个**服务器上。如果它们被直接调用的话,它们所涉及的文件必须对用户是可以访问的。 `Body:` 这是2.0新增的功能,使用Body头,资源的实际内容可以直接包含在类型表里。这个头必须包含一个指明分隔符的字符串。这样在类型表文件中,接下来直到分隔字符串之前的所有内容,会被当作是资源实体。 ### 示例: ``` Body:----xyz---- <html> <body> <p>Content of the page.</p> </body> </html> ----xyz---- ``` ## MultiViews MultiViews查询是由`Options`指令的`MultiViews`选项激活的。如果服务器接收了一个对`/some/dir/foo`的请求,而`/some/dir/foo`并_不_存在,则服务器会查找这个目录下所有的 `foo.*` 文件,并有效地伪造一个说明这些 `foo.*` 文件的类型表,假定客户可能请求的一个,把他们指定为这个类型的媒体类型及内容编码。最终选择其中最符合客户请求的文档,返回给客户。 `MultiViewsMatch`指令指示Apache在选择文件时是否考虑不包含内容协商元信息的文件。 ## CacheNegotiatedDocs 指令 | [说明](#calibre_link-18) | 允许经过内容协商的文档被代理服务器缓存 | | --- | --- | | [语法](#calibre_link-19) | `CacheNegotiatedDocs On|Off` | | [默认值](#calibre_link-24) | `CacheNegotiatedDocs Off` | | [作用域](#calibre_link-20) | server config, virtual host | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_negotiation | | [兼容性](#calibre_link-137) | 从2.0版本起,语法有了变化 | 如果设置为"On",则允许内容协商文档被代理服务器缓存。这可能意味着在代理服务器后面的客户端得到的文档并不是最符合他们情况的版本,但它能够使缓存更有效。 本指令只对HTTP/1.0浏览器的请求有效。HTTP/1.1在对内容协商文档进行缓冲方面提供了更好的控制,本指令对于HTTP/1.1的应答没有效果。 在2.0版本以前,`CacheNegotiatedDocs`指令不带任何参数;它会自己在目录存在的情况下开启。 ## ForceLanguagePriority 指令 | [说明](#calibre_link-18) | 指定无法匹配单个文档的情况下所采取的动作 | | --- | --- | | [语法](#calibre_link-19) | `ForceLanguagePriority None|Prefer|Fallback [Prefer|Fallback]` | | [默认值](#calibre_link-24) | `ForceLanguagePriority Prefer` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_negotiation | | [兼容性](#calibre_link-137) | 仅在 Apache 2.0.30 及以后的版本中可用 | `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`指令列表中第一个匹配的变体文档,而在没有变体能够匹配客户可接受的语言的情况下,返回第一个可用的变体文档。 ### 参见 * `AddLanguage` ## LanguagePriority 指令 | [说明](#calibre_link-18) | 在客户端没有指示语言偏好的情况下,语言变体的优先级列表 | | --- | --- | | [语法](#calibre_link-19) | `LanguagePriority MIME-lang [MIME-lang] ...` | | [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess | | [覆盖项](#calibre_link-66) | FileInfo | | [状态](#calibre_link-21) | 基本(B) | | [模块](#calibre_link-22) | mod_negotiation | 在处理MultiViews请求时,`LanguagePriority`指令在客户没有指示语言偏爱的情况下,设定语言变体的优先级列表。这个MIME-lang列表是按优先级降序排列的。 ### 示例: ``` LanguagePriority en fr de ``` 表示对于`foo.html`请求,如果`foo.html.fr`和`foo.html.de`同时存在,并且浏览器没有表明对语言的偏爱,那么`foo.html.fr`将被返回。 注意,本指令只在根据其它信息无法决定最好的语言或者`ForceLanguagePriority`指令不是`None`时才有效。对正确实现的HTTP/1.1请求,本指令没有任何作用。 ### 参见 * `AddLanguage`