Apache HTTP Server 版本 2.4
描述 | 自定义 HTTP 请求和响应头 |
---|---|
状态 | 扩展 |
模块标识符 | headers_module |
源文件 | mod_headers.c |
此模块提供指令来控制和修改 HTTP 请求和响应头。头可以合并、替换或删除。
由 mod_headers
提供的指令几乎可以在服务器配置中的任何位置出现,并且可以通过将它们包含在 配置节 中来限制其范围。
处理顺序很重要,它受配置文件中的顺序以及在 配置节 中的位置的影响。如果颠倒这两个指令,它们将产生不同的效果
RequestHeader append MirrorID "mirror 12" RequestHeader unset MirrorID
以这种方式,MirrorID
头不会被设置。如果颠倒,MirrorID
头将被设置为 "mirror 12"。
mod_headers
可以应用于请求的早期或后期。正常模式是后期,当请求头在运行内容生成器之前立即设置,而响应头在响应被发送到网络时立即设置。在运行的服务器中始终使用后期模式。
早期模式被设计为开发人员的测试/调试辅助工具。使用 early
关键字定义的指令在处理请求的开始时立即设置。这意味着它们可以用来模拟不同的请求并设置测试用例,但也意味着头可以在任何时候被其他模块更改,然后再生成响应。
由于早期指令是在遍历请求路径的配置之前处理的,因此早期头只能在主服务器或虚拟主机上下文中设置。早期指令不能依赖于请求路径,因此它们在 <Directory>
或 <Location>
等上下文中会失败。
Header echo ^TS
MyHeader
,其中包含接收请求的时间戳和开始提供请求所需的时间。客户端可以使用此头来推断服务器上的负载或隔离客户端和服务器之间的瓶颈。Header set MyHeader "%D %t"
导致此头被添加到响应中
MyHeader: D=3775428 t=991424704447256
Header set 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.
MyRequestHeader
时,才在响应中发送 MyHeader
。这对于根据某些客户端刺激来构建头很有用。请注意,此示例需要 mod_setenvif
模块的服务。SetEnvIf MyRequestHeader myvalue HAVE_MyRequestHeader Header set MyHeader "%D %t mytext" env=HAVE_MyRequestHeader
如果 HTTP 请求中存在头 MyRequestHeader: myvalue
,则响应将包含以下头
MyHeader: D=3775428 t=991424704447256 mytext
RequestHeader edit Destination ^https: http: early
CGI
、NO_CACHE
和 NO_STORE
环境变量)Header merge Cache-Control no-cache env=CGI Header merge Cache-Control no-cache env=NO_CACHE Header merge Cache-Control no-store env=NO_STORE
则响应将包含以下头
Cache-Control: no-cache, no-store
如果使用 append
而不是 merge
,则响应将包含以下头
Cache-Control: no-cache, no-cache, no-store
Header set Set-Cookie testcookie "expr=-z %{req:Cookie}"
Header append Cache-Control s-maxage=600 "expr=%{REQUEST_STATUS} == 200"
描述 | 配置 HTTP 响应头 |
---|---|
语法 | Header [condition] add|append|echo|edit|edit*|merge|set|setifempty|unset|note header [[expr=]value [replacement] [early|env=[!]varname|expr=expression]] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 扩展 |
模块 | mod_headers |
兼容性 | SetIfEmpty 在 2.4.7 及更高版本中可用,expr=value 在 2.4.10 及更高版本中可用 |
此指令可以替换、合并或删除 HTTP 响应头。头在内容处理程序和输出过滤器运行之后立即被修改,允许修改传出的头。
可选的 condition 参数决定此指令将针对哪个内部响应头表进行操作:onsuccess
(默认,可以省略)或 always
。这两个列表之间的区别在于,后者包含的头即使在错误情况下也会添加到响应中,并在内部重定向(例如,ErrorDocument 处理程序)中持久化。还要注意,在某些情况下,使用这两个条件重复此指令是有意义的,因为 always
对于现有头来说不是 onsuccess
的超集
always
对应的表。mod_proxy_fcgi
生成的头,在这种情况下,CGI 脚本的头位于与 always
对应的表中,而不是在默认表中。onsuccess
条件下没有找到。onsuccess
和 always
之间的这种区别是一个特性,它是在 httpd 如何在内部存储 HTTP 响应的头时产生的结果,因为它不提供任何 "规范化" 的单个头列表。如果在编写配置时没有牢记以下概念,可能会出现的主要问题是,某些 HTTP 响应最终可能会包含重复的相同头(使用户或有时甚至 HTTP 客户端感到困惑)。例如,假设您有一个使用 mod_proxy_fcgi
的简单 PHP 代理设置,并且您的后端 PHP 脚本将 X-Foo: bar
头添加到每个 HTTP 响应中。如上所述,mod_proxy_fcgi
使用 always
表来存储头,因此以下配置最终会导致错误的结果,即头被重复,并且包含两个值
# X-Foo's value is set in the 'onsuccess' headers table Header set X-Foo: baz
为了规避此限制,有一些已知的配置模式可以提供帮助,例如以下模式
# 'onsuccess' can be omitted since it is the default Header onsuccess unset X-Foo Header always set X-Foo "baz"
除了上面描述的 condition 参数之外,您还可以根据 HTTP 状态代码来限制操作,例如代理或 CGI 请求。请参阅上面部分中使用 %{REQUEST_STATUS} 的示例。
它执行的操作由第一个参数(如果指定了 condition,则为第二个参数)决定。这可以是以下值之一
在开始阅读操作列表之前,请阅读上面描述的 always
和 onsuccess
头列表之间的区别,因为这个重要的概念仍然适用。实际上,每个操作都按描述的那样工作,但仅针对目标头列表。
add
set
、append
或 merge
代替。append
echo
edit
edit*
edit
形式将在一个头值中精确匹配和替换一次,而 edit*
形式将替换搜索模式的所有实例,如果它出现不止一次。merge
set
setifempty
setifempty
时,该头并不在响应中。在这种情况下,使用 set
更安全,例如:Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}"
unset
note
此参数后跟一个 header 名称,可以包含最后的冒号,但不是必需的。对于 set
、append
、merge
、add
、unset
和 edit
,不区分大小写。echo
的 header 名称区分大小写,可以是 正则表达式。
对于 set
、append
、merge
和 add
,value 指定为下一个参数。如果 value 包含空格,则应将其用双引号括起来。 value 可以是字符字符串、包含 mod_headers
特定格式说明符(和字符字面量)的字符串,或者以 expr= 为前缀的 ap_expr 表达式。
以下格式说明符在 value 中受支持。
格式 | 描述 |
---|---|
%% |
百分号 |
%t |
自纪元(1970 年 1 月 1 日)以来的请求接收时间,以微秒为单位,以通用协调时间表示。该值以 t= 为前缀。 |
%D |
从请求接收时间到头在网络上传输的时间。这是请求持续时间的度量。该值以 D= 为前缀。该值以微秒为单位。 |
%l |
实际服务器本身的当前负载平均值。它旨在公开 getloadavg() 获得的值,它表示当前负载平均值、5 分钟平均值和 15 分钟平均值。该值以 l= 为前缀,每个平均值之间用 / 分隔。在 2.4.4 及更高版本中可用。 |
%i |
基于可用进程和线程的 httpd 的当前空闲百分比(0 到 100)。该值以 i= 为前缀。在 2.4.4 及更高版本中可用。 |
%b |
基于可用进程和线程的 httpd 的当前繁忙百分比(0 到 100)。该值以 b= 为前缀。在 2.4.4 及更高版本中可用。 |
%{VARNAME}e |
环境变量 VARNAME 的内容。 |
%{VARNAME}s |
如果启用了 mod_ssl ,则为 SSL 环境变量 VARNAME 的内容。 |
%s
格式说明符仅在 Apache 2.1 及更高版本中可用;它可以用来代替 %e
,以避免启用 SSLOptions +StdEnvVars
的开销。如果出于其他原因必须启用 SSLOptions +StdEnvVars
,则 %e
比 %s
更有效。
当 value 参数使用 ap_expr 解析器时,某些表达式语法将不同于评估 boolean 表达式(如 <If>)的示例。
Header set foo-checksum "expr=%{md5:foo}"
对于 edit
,既有 value 参数,它是一个 正则表达式,还有一个额外的 replacement 字符串。从 2.4.7 版本开始,替换字符串也可以包含格式说明符。
Header
指令后可以跟一个额外的参数,它可以是以下任何一个:
early
env=[!]varname
varname
存在时,才会应用该指令。varname
前面的 !
反转测试,因此该指令仅在 varname
未设置时才应用。expr=expression
# This delays the evaluation of the condition clause compared to <If> Header always set CustomHeader my-value "expr=%{REQUEST_URI} =~ m#^/special_path.php$#"
除了 早期 模式外,Header
指令在响应发送到网络之前处理。这意味着可以设置和/或覆盖大多数头,除了 HTTP 头过滤器添加的一些头。在 2.2.12 之前,无法使用此指令更改 Content-Type 头。
描述 | 配置 HTTP 请求头 |
---|---|
语法 | RequestHeader add|append|edit|edit*|merge|set|setifempty|unset header [[expr=]value [replacement] [early|env=[!]varname|expr=expression]] |
上下文 | 服务器配置、虚拟主机、目录、.htaccess |
覆盖 | FileInfo |
状态 | 扩展 |
模块 | mod_headers |
兼容性 | SetIfEmpty 在 2.4.7 及更高版本中可用,expr=value 在 2.4.10 及更高版本中可用 |
此指令可以替换、合并、更改或删除 HTTP 请求头。头在内容处理程序运行之前修改,允许修改传入的头。它执行的操作由第一个参数决定。它可以是以下值之一:
add
set
、append
或 merge
代替。append
edit
edit*
edit
形式将在头值中匹配并替换一次,而 edit*
形式将替换搜索模式的每个实例,如果它出现不止一次。merge
set
setifempty
unset
此参数后跟一个头名称,可以包含最后的冒号,但不是必需的。不区分大小写。对于 set
、append
、merge
和 add
,第三个参数是 value。如果 value 包含空格,则应将其用双引号括起来。对于 unset
,不应给出 value。 value 可以是字符字符串、包含格式说明符的字符串或两者的组合。支持的格式说明符与 Header
相同,请查看那里以了解详细信息。对于 edit
,需要 value 和 replacement,它们分别是 正则表达式 和替换字符串。
RequestHeader
指令后可以跟一个额外的参数,它可以是以下任何一个:
early
env=[!]varname
varname
存在时,才会应用该指令。varname
前面的 !
反转测试,因此该指令仅在 varname
未设置时才应用。expr=expression
除了 早期 模式外,RequestHeader
指令在请求由其处理程序在修复阶段运行之前处理。这应该允许覆盖或修改由浏览器或 Apache 输入过滤器生成的标头。