# 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
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航