# 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`
- Apache HTTP Server Version 2.2 文档 [最后更新:2006年3月21日]
- 版本说明
- 从1.3升级到2.0
- 从2.0升级到2.2
- Apache 2.2 新特性概述
- Apache 2.0 新特性概述
- The Apache License, Version 2.0
- 参考手册
- 编译与安装
- 启动Apache
- 停止和重启
- 配置文件
- 配置段(容器)
- 缓冲指南
- 服务器全局配置
- 日志文件
- 从URL到文件系统的映射
- 安全方面的提示
- 动态共享对象(DSO)支持
- 内容协商
- 自定义错误响应
- 地址和端口的绑定(Binding)
- 多路处理模块
- Apache的环境变量
- Apache处理器的使用
- 过滤器(Filter)
- suEXEC支持
- 性能方面的提示
- URL重写指南
- Apache虚拟主机文档
- 基于主机名的虚拟主机
- 基于IP地址的虚拟主机
- 大批量虚拟主机的动态配置
- 虚拟主机示例
- 深入研究虚拟主机的匹配
- 文件描述符限制
- 关于DNS和Apache
- 常见问题
- 经常问到的问题
- Apache的SSL/TLS加密
- SSL/TLS高强度加密:绪论
- SSL/TLS高强度加密:兼容性
- SSL/TLS高强度加密:如何...?
- SSL/TLS Strong Encryption: FAQ
- 如何.../指南
- 认证、授权、访问控制
- CGI动态页面
- 服务器端包含入门
- .htaccess文件
- 用户网站目录
- 针对特定平台的说明
- 在Microsoft Windows中使用Apache
- 在Microsoft Windows上编译Apache
- Using Apache With Novell NetWare
- Running a High-Performance Web Server on HPUX
- The Apache EBCDIC Port
- 服务器和支持程序
- httpd - Apache超文本传输协议服务器
- ab - Apache HTTP服务器性能测试工具
- apachectl - Apache HTTP服务器控制接口
- apxs - Apache 扩展工具
- configure - 配置源代码树
- dbmmanage - 管理DBM格式的用户认证文件
- htcacheclean - 清理磁盘缓冲区
- htdbm - 操作DBM密码数据库
- htdigest - 管理用于摘要认证的用户文件
- httxt2dbm - 生成RewriteMap指令使用的dbm文件
- htpasswd - 管理用于基本认证的用户文件
- logresolve - 解析Apache日志中的IP地址为主机名
- rotatelogs - 滚动Apache日志的管道日志程序
- suexec - 在执行外部程序之前切换用户
- 其他程序
- 杂项文档
- 与Apache相关的标准
- Apache模块
- 描述模块的术语
- 描述指令的术语
- Apache核心(Core)特性
- Apache MPM 公共指令
- Apache MPM beos
- Apache MPM event
- Apache MPM netware
- Apache MPM os2
- Apache MPM prefork
- Apache MPM winnt
- Apache MPM worker
- Apache模块 mod_actions
- Apache模块 mod_alias
- Apache模块 mod_asis
- Apache模块 mod_auth_basic
- Apache模块 mod_auth_digest
- Apache模块 mod_authn_alias
- Apache模块 mod_authn_anon
- Apache模块 mod_authn_dbd
- Apache模块 mod_authn_dbm
- Apache模块 mod_authn_default
- Apache模块 mod_authn_file
- Apache模块 mod_authnz_ldap
- Apache模块 mod_authz_dbm
- Apache模块 mod_authz_default
- Apache模块 mod_authz_groupfile
- Apache模块 mod_authz_host
- Apache模块 mod_authz_owner
- Apache模块 mod_authz_user
- Apache模块 mod_autoindex
- Apache模块 mod_cache
- Apache模块 mod_cern_meta
- Apache模块 mod_cgi
- Apache模块 mod_cgid
- Apache模块 mod_charset_lite
- Apache模块 mod_dav
- Apache模块 mod_dav_fs
- Apache模块 mod_dav_lock
- Apache模块 mod_dbd
- Apache模块 mod_deflate
- Apache模块 mod_dir
- Apache模块 mod_disk_cache
- Apache模块 mod_dumpio
- Apache模块 mod_echo
- Apache模块 mod_env
- Apache模块 mod_example
- Apache模块 mod_expires
- Apache模块 mod_ext_filter
- Apache模块 mod_file_cache
- Apache模块 mod_filter
- Apache模块 mod_headers
- Apache模块 mod_ident
- Apache模块 mod_imagemap
- Apache模块 mod_include
- Apache模块 mod_info
- Apache模块 mod_isapi
- Apache模块 mod_ldap
- Apache模块 mod_log_config
- Apache模块 mod_log_forensic
- Apache模块 mod_logio
- Apache模块 mod_mem_cache
- Apache模块 mod_mime
- Apache模块 mod_mime_magic
- Apache模块 mod_negotiation
- Apache模块 mod_nw_ssl
- Apache模块 mod_proxy
- Apache模块 mod_proxy_ajp
- Apache模块 mod_proxy_balancer
- Apache模块 mod_proxy_connect
- Apache模块 mod_proxy_ftp
- Apache模块 mod_proxy_http
- Apache模块 mod_rewrite
- Apache模块 mod_setenvif
- Apache模块 mod_so
- Apache模块 mod_speling
- Apache模块 mod_ssl
- Apache模块 mod_status
- Apache模块 mod_suexec
- Apache模块 mod_unique_id
- Apache模块 mod_userdir
- Apache模块 mod_usertrack
- Apache模块 mod_version
- Apache模块 mod_vhost_alias
- Developer Documentation for Apache 2.0
- Apache 1.3 API notes
- Debugging Memory Allocation in APR
- Documenting Apache 2.0
- Apache 2.0 Hook Functions
- Converting Modules from Apache 1.3 to Apache 2.0
- Request Processing in Apache 2.0
- How filters work in Apache 2.0
- Apache 2.0 Thread Safety Issues
- 词汇和索引
- 词汇表
- 指令索引
- 指令速查
- 模块索引
- 站点导航