# Apache模塊 mod_headers
| [說明](#calibre_link-11) | 允許通過配置文件控制任意的HTTP請求和應答頭信息 |
| --- | --- |
| [狀態](#calibre_link-12) | 擴展(E) |
| [模塊名](#calibre_link-13) | headers_module |
| [源文件](#calibre_link-14) | mod_headers.c |
| [兼容性](#calibre_link-58) | `RequestHeader`僅在 Apache 2.0 中有效 |
### 概述
這個模塊提供了一些指令用于控制和修改HTTP請求頭和應答頭。這些頭可以被合并、替換、刪除。
## 處理順序
由`mod_headers`提供的指令幾乎可以出現在配置文件的任何部分。并可以封裝在[配置段](#calibre_link-256)中以限制其作用范圍。
指令的處理順序很重要,它取決于指令本身在配置文件中的位置和所屬[配置段](#calibre_link-452)在配置文件中的位置。下面的指令如果顛倒一下順序將會導致完全不同的結果:
```
RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID
```
當前順序下,`MirrorID`頭不會被設置。若顛倒一下順序,`MirrorID`頭將被設為"mirror 12"。
## 前處理和后處理
`mod_headers`可以應用在請求被處理之前或之后。通常的模式是"后處理",也就是在請求處理完畢之后、發送應答之前設置應答頭。[原文:when Request Headers are set immediately before running the content generator and Response Headers just as the response is sent down the wire.]在實際工作的服務器上應當始終使用"后處理"模式。
"前處理"模式應當僅僅作為開發者使用的一種測試/調試輔助工具。可以在指令中使用`early`關鍵字啟用"前處理"模式,此時將在處理請求之前設置請求頭。這樣就可以模擬各種不同的請求以協助調試。
由于"前處理"模式的指令在將URL映射到文件系統之前就生效了,不能依賴于所請求的路徑。所以"前處理"模式的指令只能用在主服務器和虛擬主機部分的配置中,而不能用于`<Directory>`或`<Location>`配置段中。
## 示例
1. 將所有以"TS"開頭的請求頭復制到應答頭中:
```
Header echo ^TS
```
2. 在應答中添加一個`MyHeader`頭來包含服務端接受到請求的時間戳和經過多少時間以后才完成對該請求的處理并作出應答。這個頭可以讓客戶端知道瓶頸位于服務端還是位于服務端和客戶端之間的線路。
```
Header add MyHeader "%D %t"
```
上面的設置將會添加如下應答頭內容:
```
MyHeader: D=3775428 t=991424704447256
```
3. 向Joe問好(Hello):
```
Header add MyHeader "Hello Joe. It took %D microseconds \
for Apache to serve this request."
```
上面的設置將會添加如下應答頭內容:
```
MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to serve this request.
```
4. 當且僅當"MyRequestHeader"出現在請求頭中的時候才在應答中發送"`MyHeader`"頭。這個對根據特定的客戶端構造特定的應答頭很有用。注意,下面的例子需要`mod_setenvif`模塊的支持。
```
SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeader
```
如果請求中出現"`MyRequestHeader: value`"頭,應答中將會包含下面的頭:
```
MyHeader: D=3775428 t=991424704447256 mytext
```
## Header 指令
| [說明](#calibre_link-18) | 配置HTTP應答頭 |
| --- | --- |
| [語法](#calibre_link-19) | `Header [condition] set|append|add|unset|echo header [value] [early|env=[!]variable]` |
| [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess |
| [覆蓋項](#calibre_link-66) | FileInfo |
| [狀態](#calibre_link-21) | 擴展(E) |
| [模塊](#calibre_link-22) | mod_headers |
這個指令可以替換、合并、刪除HTTP應答頭。應答頭緊跟在內容處理器和輸出過濾器完工之后生成,這時候才能對頭進行修改。
condition選項可以是`onsuccess`或`always` 。它決定了將對哪個內部頭(internal header)表進行操作。`onsuccess`表示"`2xx`"狀態碼,`always`表示所有狀態碼(包含"`2xx`")。特別地,如果你想撤銷由某個模塊設置的頭,你應當做做試驗,以找到是那個表產生的影響。
該指令執行的動作是由第二個參數決定的。這個參數取值范圍如下:
`set`
設置新的或修改已經存在的同名應答頭。value可以是一個格式字符串。
`append`
向同名應答頭添加新內容而不修改原來已經存在的舊內容。當向一個已經存在的頭添加新值時,將用逗號與原來已經存在的舊值分開。這是向HTTP頭賦以多個值的標準方法。
`add`
向應答中添加新的頭而不修改原來已經存在的頭(即使同名)。這將可能導致有兩個或更多的應答頭具有相同的名字,從而導致意想不到的后果,所以通常不使用這種方法而用`append`來代替它。
`unset`
去除應答中同名的頭(若存在的話)。如果有多個頭同名,則會被全部去除。value必須被省略。
`echo`
將請求中同名的頭復制到應答中。header可以是一個[正則表達式](#calibre_link-67 "see glossary")。value必須被省略。
這個參數后面必須要跟一個header名字(結尾的冒號可要可不要)。`set`, `append`, `add`, `unset`是大小寫無關的。用于`echo`的header是大小寫敏感的,并且可以是一個[正則表達式](#calibre_link-67 "see glossary")。
對于`add`, `append`, `set`來說,value是第三個參數。如果value包含空格則必須用雙引號(")括起來。value可以是一個普通字符串或包含格式說明符的字符串,value支持下列格式字符串:
| 格式 | 描述 |
| --- | --- |
| `%%` | 百分號(%) |
| `%t` | 接收到請求的微秒時間戳(相對于1970-1-1 00:00:00 UCT),外加一個"`t=`"前綴。 |
| `%D` | 從接收到請求到完成對該請求的處理并作出應答共花費了多少微秒,外加一個"`D=`"前綴。 |
| `%{FOOBAR}e` | [環境變量](#calibre_link-232)`FOOBAR`的內容 |
| `%{FOOBAR}s` | [SSL環境變量](#calibre_link-486)`FOOBAR`的內容(如果啟用了`mod_ssl`) |
### 注意
"`%s`"格式符僅在Apache 2.1及以后的版本中可用。它可以代替"`%e`"以避免"`SSLOptions +StdEnvVars`"帶來的額外開銷。如果因為別的原因必須開啟"`SSLOptions +StdEnvVars`",那么"`%e`"將比"`%s`"更加合適。
`Header`后面可以跟一個用于指定生效條件的額外參數(或者用`early`表示"[前處理](#calibre_link-956)")。如果在"`env=...`"參數中指定的[環境變量](#calibre_link-232)存在(或用"`env=!...`"表示不存在),那么`Header`指令指定的動作將會生效,否則將不會生效。
除非使用[early](#calibre_link-956)模式,否則`Header`指令將在應答最后被發送到網絡前處理。這意味著可以設置和改寫絕大多數應答頭,除了自己添加的應答頭。
## RequestHeader 指令
| [說明](#calibre_link-18) | 配置HTTP請求頭 |
| --- | --- |
| [語法](#calibre_link-19) | `RequestHeader set|append|add|unset header [value] [early|env=[!]variable]` |
| [作用域](#calibre_link-20) | server config, virtual host, directory, .htaccess |
| [覆蓋項](#calibre_link-66) | FileInfo |
| [狀態](#calibre_link-21) | 擴展(E) |
| [模塊](#calibre_link-22) | mod_headers |
| [兼容性](#calibre_link-137) | 僅在 Apache 2.0 中有效 |
這個指令可以替換、合并、刪除HTTP應答頭。請求頭將會在內容處理器運行之前被修改。修改的動作由第一個參數決定,其取值范圍如下:
`set`
設置新的或修改已經存在的同名請求頭。
`append`
向同名請求頭添加新內容而不修改原來已經存在的舊內容。當向一個已經存在的頭添加新值時,將用逗號與原來已經存在的舊值分開。這是向HTTP頭賦以多個值的標準方法。
`add`
向請求中添加新的頭而不修改原來已經存在的頭(即使同名)。這將可能導致有兩個或更多的請求頭具有相同的名字,從而導致意想不到的后果,所以通常不使用這種方法而用`append`來代替它。
`unset`
去除請求中同名的頭(若存在的話)。如果有多個頭同名,則會被全部去除。value必須被省略。
這些參數后面必須要跟一個header名(結尾的冒號可要可不要,且大小寫無關)。對于`add`, `append`, `set`來說,value是第三個參數。如果value包含空格則必須用雙引號(")括起來。對于`unset`來說則不需要value參數。value可以是一個普通字符串或包含格式說明符的字符串,格式字符串的用法與`Header`指令一樣。
`RequestHeader`后面可以跟一個用于指定生效條件的額外參數(或者用`early`表示"[前處理](#calibre_link-956)")。如果在"`env=...`"參數中指定的[環境變量](#calibre_link-232)存在(或用"`env=!...`"表示不存在),那么`RequestHeader`指令指定的動作將會生效,否則將不會生效。
除非使用[early](#calibre_link-956)模式,否則`RequestHeader`將在請求被處理之前生效。這樣,由瀏覽器和Apache輸入過濾器產生的請求頭都可以被該指令處理。
- 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
- 詞匯和索引
- 詞匯表
- 指令索引
- 指令速查
- 模塊索引
- 站點導航