<-
Apache > HTTP 服务器 > 文档 > 版本 2.4 > 模块

Apache 模块 mod_headers

可用语言:  en  |  fr  |  ja  |  ko 

描述自定义 HTTP 请求和响应头
状态扩展
模块标识符headers_module
源文件mod_headers.c

摘要

此模块提供指令来控制和修改 HTTP 请求和响应头。头可以合并、替换或删除。

Support Apache!

主题

指令

错误修复清单

另请参阅

top

处理顺序

mod_headers 提供的指令几乎可以在服务器配置中的任何位置出现,并且可以通过将它们包含在 配置节 中来限制其范围。

处理顺序很重要,它受配置文件中的顺序以及在 配置节 中的位置的影响。如果颠倒这两个指令,它们将产生不同的效果

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

以这种方式,MirrorID 头不会被设置。如果颠倒,MirrorID 头将被设置为 "mirror 12"。

top

早期和后期处理

mod_headers 可以应用于请求的早期或后期。正常模式是后期,当请求头在运行内容生成器之前立即设置,而响应头在响应被发送到网络时立即设置。在运行的服务器中始终使用后期模式。

早期模式被设计为开发人员的测试/调试辅助工具。使用 early 关键字定义的指令在处理请求的开始时立即设置。这意味着它们可以用来模拟不同的请求并设置测试用例,但也意味着头可以在任何时候被其他模块更改,然后再生成响应。

由于早期指令是在遍历请求路径的配置之前处理的,因此早期头只能在主服务器或虚拟主机上下文中设置。早期指令不能依赖于请求路径,因此它们在 <Directory><Location> 等上下文中会失败。

top

示例

  1. 将所有以 "TS" 开头的请求头复制到响应头
    Header echo ^TS
  2. 向响应添加一个头 MyHeader,其中包含接收请求的时间戳和开始提供请求所需的时间。客户端可以使用此头来推断服务器上的负载或隔离客户端和服务器之间的瓶颈。
    Header set MyHeader "%D %t"

    导致此头被添加到响应中

    MyHeader: D=3775428 t=991424704447256

  3. 向 Joe 问好
    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.

  4. 仅当请求中存在头 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

  5. 通过将 https: 替换为 http:Destination 头中,使 DAV 能够与通过 SSL 硬件运行 HTTP 的 Apache 协同工作 (问题描述)
    RequestHeader edit Destination ^https: http: early
  6. 在多个非排他性条件下设置相同的头值,但不要在最终头中重复该值。如果以下所有条件都适用于请求(即,如果请求存在 CGINO_CACHENO_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

  7. 仅当客户端没有向我们发送 cookie 时,才设置测试 cookie
    Header set Set-Cookie testcookie "expr=-z %{req:Cookie}"
  8. 为 HTTP 状态代码为 200 的响应追加缓存头
    Header append Cache-Control s-maxage=600 "expr=%{REQUEST_STATUS} == 200"
top

Header 指令

描述配置 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 的超集

onsuccessalways 之间的这种区别是一个特性,它是在 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,则为第二个参数)决定。这可以是以下值之一

警告

在开始阅读操作列表之前,请阅读上面描述的 alwaysonsuccess 头列表之间的区别,因为这个重要的概念仍然适用。实际上,每个操作都按描述的那样工作,但仅针对目标头列表。

add
响应头将被添加到现有的头集中,即使此头已经存在。这可能导致两个(或更多)头具有相同的名称。这可能导致不可预见的后果,通常应该使用 setappendmerge 代替。
append
响应头将被追加到任何具有相同名称的现有头。当将新值合并到现有头时,它将用逗号与现有头隔开。这是为头提供多个值的 HTTP 标准方法。
echo
具有此名称的请求头将在响应头中回显。 header 可以是 正则表达式。必须省略 value
edit
edit*
如果此响应头存在,则其值将根据 正则表达式 搜索和替换进行转换。 value 参数是 正则表达式,而 replacement 是替换字符串,它可能包含反向引用或格式说明符。 edit 形式将在一个头值中精确匹配和替换一次,而 edit* 形式将替换搜索模式的所有实例,如果它出现不止一次。
merge
响应头将被追加到任何具有相同名称的现有头,除非要追加的值已出现在头的逗号分隔值列表中。当将新值合并到现有头时,它将用逗号与现有头隔开。这是为头提供多个值的 HTTP 标准方法。值以区分大小写的方式进行比较,并且在处理完所有格式说明符之后进行比较。用双引号括起来的值被认为与其他相同的未加引号的值不同。
set
设置响应头,用此名称替换任何先前存在的头。 value 可以是格式字符串。
setifempty
设置请求头,但前提是之前没有同名头。
Content-Type 头是一个特殊情况,因为它的值可能已经确定,但当评估 setifempty 时,该头并不在响应中。在这种情况下,使用 set 更安全,例如:
Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}"
unset
如果存在,则删除此名称的响应头。如果存在多个同名头,则全部删除。 value 必须省略。
note
将命名响应 header 的值复制到一个内部注释中,该注释的名称由 value 给出。如果由 CGI 或代理资源发送的头被配置为取消设置,但也要记录,这将很有用。
在 2.4.7 及更高版本中可用。

此参数后跟一个 header 名称,可以包含最后的冒号,但不是必需的。对于 setappendmergeaddunsetedit,不区分大小写。echoheader 名称区分大小写,可以是 正则表达式

对于 setappendmergeaddvalue 指定为下一个参数。如果 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>)的示例。

  • 语法的起点是 'string' 而不是 'expr'。
  • 函数调用使用 %{funcname:arg} 语法,而不是 funcname(arg)。
  • 目前无法从这个起点访问多参数函数。
  • 引用整个参数,例如
    Header set foo-checksum "expr=%{md5:foo}"

对于 edit,既有 value 参数,它是一个 正则表达式,还有一个额外的 replacement 字符串。从 2.4.7 版本开始,替换字符串也可以包含格式说明符。

Header 指令后可以跟一个额外的参数,它可以是以下任何一个:

early
指定 早期处理
env=[!]varname
当且仅当环境变量 varname 存在时,才会应用该指令。varname 前面的 ! 反转测试,因此该指令仅在 varname 未设置时才应用。
expr=expression
当且仅当 expression 评估为真时,才会应用该指令。表达式语法和评估的详细信息在 ap_expr 文档中记录。
# 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 头。

top

RequestHeader Directive

描述配置 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
将请求头添加到现有的头集中,即使该头已经存在。这会导致两个(或更多)头具有相同的名称。这会导致不可预见的后果,通常应使用 setappendmerge 代替。
append
将请求头追加到任何现有的同名头。当将新值合并到现有头时,它与现有头之间用逗号分隔。这是 HTTP 标准中为头提供多个值的规范方法。
edit
edit*
如果此请求头存在,则根据 正则表达式 搜索和替换对其值进行转换。 value 参数是一个 正则表达式replacement 是一个替换字符串,它可以包含反向引用或格式说明符。edit 形式将在头值中匹配并替换一次,而 edit* 形式将替换搜索模式的每个实例,如果它出现不止一次。
merge
将请求头追加到任何现有的同名头,除非要追加的值已出现在现有头的逗号分隔值列表中。当将新值合并到现有头时,它与现有头之间用逗号分隔。这是 HTTP 标准中为头提供多个值的规范方法。值比较区分大小写,并且在处理完所有格式说明符后进行。双引号中的值与其他相同但未加引号的值不同。
set
设置请求头,用此名称替换任何先前存在的头。
setifempty
设置请求头,但前提是之前没有同名头。
在 2.4.7 及更高版本中可用。
unset
如果存在,则删除此名称的请求头。如果存在多个同名头,则全部删除。 value 必须省略。

此参数后跟一个头名称,可以包含最后的冒号,但不是必需的。不区分大小写。对于 setappendmergeadd,第三个参数是 value。如果 value 包含空格,则应将其用双引号括起来。对于 unset,不应给出 valuevalue 可以是字符字符串、包含格式说明符的字符串或两者的组合。支持的格式说明符与 Header 相同,请查看那里以了解详细信息。对于 edit,需要 valuereplacement,它们分别是 正则表达式 和替换字符串。

RequestHeader 指令后可以跟一个额外的参数,它可以是以下任何一个:

early
指定 早期处理
env=[!]varname
当且仅当环境变量 varname 存在时,才会应用该指令。varname 前面的 ! 反转测试,因此该指令仅在 varname 未设置时才应用。
expr=expression
当且仅当 expression 评估为真时,才会应用该指令。表达式语法和评估的详细信息在 ap_expr 文档中记录。

除了 早期 模式外,RequestHeader 指令在请求由其处理程序在修复阶段运行之前处理。这应该允许覆盖或修改由浏览器或 Apache 输入过滤器生成的标头。

可用语言:  en  |  fr  |  ja  |  ko 

top

评论

注意
这不是问答区。此处放置的评论应指向有关改进文档或服务器的建议,如果它们已实施或被认为无效/主题外,可能会被我们的版主删除。有关如何管理 Apache HTTP Server 的问题应发送到我们的 IRC 频道 #httpd(在 Libera.chat 上),或发送到我们的 邮件列表