<-
Apache HTTP 服务器 2.4 > Apache模块mod_headers

Apache模块mod_headers

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

摘要

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

支持Apache!

主题

指令

错误修正清单

也可以看看

最佳

加工顺序

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

处理的顺序很重要,并且受配置文件中的顺序以及配置部分中的放置位置的影响。如果相反,这两个指令具有不同的效果:

RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID

这样一来,MirrorID就不会设置标题。如果反转,则MirrorID标头设置为“镜像12”。

最佳

早期和晚期处理

mod_headers可以在请求的早期或晚期应用。正常模式已晚,当在运行内容生成器和响应标 头之前立即设置请求标头时,就像响应是通过有线发送一样。始终在可运行的服务器中使用“后期”模式。

早期模式旨在为开发人员提供测试/调试帮助。使用early关键字定义的指令在处理请求的开始就设置好了。这意味着可以将它们用于模拟不同的请求并设置测试用例,但这也意味着可以在生成响应之前由其他模块随时更改标头。

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

最佳

例子

  1. 将所有以“ TS”开头的请求标头复制到响应标头:
    Header echo ^TS
  2. MyHeader在响应中 添加标头,其中包括时间戳,该时间戳表示接收请求的时间以及开始处理请求所需的时间。客户端可以使用此标头来指示服务器上的负载或隔离客户端和服务器之间的瓶颈。
    Header set MyHeader "%D %t"

    导致将此标头添加到响应中:

    MyHeader: D=3775428 t=991424704447256

  3. 向乔问好
    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. MyHeader当且仅当MyRequestHeader请求头中存在标头时,才有 条件地发送响应。这对于响应某些客户端刺激构建标头很有用。请注意,此示例需要mod_setenvif模块的服务 。
    SetEnvIf MyRequestHeader myvalue HAVE_MyRequestHeader
    Header set MyHeader "%D %t mytext" env=HAVE_MyRequestHeader

    如果标头MyRequestHeader: myvalue出现在HTTP请求中,则响应将包含以下标头:

    MyHeader: D=3775428 t=991424704447256 mytext

  5. 通过在Destination标头中将https:替换为http :,使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"
最佳

标头 指令

描述:配置HTTP响应头
句法:Header [condition] add|append|echo|edit|edit*|merge|set|setifempty|unset|note header [[expr=]value [replacement] [early|env=[!]varname|expr=expression]]
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_headers
兼容性:SetIfEmpty在2.4.7和更高版本中可用,expr = value在2.4.10和更高版本中可用

该指令可以替换,合并或删除HTTP响应头。在运行内容处理程序和输出过滤器之后立即修改标头,从而允许修改传出标头。

可选的condition参数确定此伪指令将针对哪个内部响应头表:( onsuccess默认值,可以省略)或always。这两个列表之间的区别在于,即使在发生错误时,后者中包含的标头也会添加到响应中,并在内部重定向(例如ErrorDocument处理程序)中保持不变。还请注意,在某些情况下,在两种情况下都重复此指令是有意义的,因为always这不是onsuccess相对于现有标头的超集 :

onsuccess和之间的这种差异always是httpd内部存储HTTP响应标头的结果,因为它不提供任何“标准化”标头列表。如果在编写配置时不牢记以下概念,可能会出现的主要问题是某些HTTP响应可能最终会重复相同的标头(使用户困惑,有时甚至是HTTP客户端)。例如,假设您有一个简单的PHP代理设置, mod_proxy_fcgi并且后端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"

与上述条件参数不同,您可以基于HTTP状态代码(例如,代理请求或CGI请求)限制操作。请参阅上面部分中使用%{REQUEST_STATUS}的示例。

它执行的操作由第一个参数确定(如果指定了条件,则由第二个参数确定)。这可以是以下值之一:

警告

在开始阅读操作列表之前,请阅读上述alwaysonsuccess标头列表之间的区别,因为该重要概念仍然适用。实际上,每个动作均按说明进行工作,但仅在目标标头列表上。

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

此参数后跟标题名称,该名称可以包含最后的冒号,但这不是必需的。Case是忽略不计setappendmergeaddunsetedit。的报头进行名称echo 是大小写敏感的,并且可以是正则表达式

setappendmergeadd一个被指定为下一个参数。如果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 SSL环境变量 的内容(VARNAME如果mod_ssl已启用)。

注意

%s格式说明仅在Apache的2.1及更高版本; 可以使用它代替%e 避免启用的开销SSLOptions +StdEnvVars。如果SSLOptions +StdEnvVars无论如何由于其他原因必须启用,%e将会比效率更高%s

注意表达式值

当value参数使用ap_expr 解析器时,某些表达式语法将不同于评估布尔表达式的示例, 例如<If>:

  • 语法的起点是“字符串”而不是“ expr”。
  • 函数调用使用%{funcname:arg}语法而不是funcname(arg)。
  • 从此起点当前无法使用多参数函数
  • 引用整个参数,例如
    Header set foo-checksum "expr=%{md5:foo}"

因为edit既有一个参数,它是一个正则表达式,又有一个附加的替换字符串。从版本2.4.7开始,替换字符串也可能包含格式说明符。

Header指令后面可以有一个附加参数,可以是以下任何一个:

early
指定早期处理
env=[!]varname
当且仅当环境变量 varname存在时,才应用该指令。!前面的A varname会使测试反向,因此该指令仅在varname未设置的情况下适用。
expr=expression
当且仅当expression的 计算结果为true时,才应用该指令。表达式语法和求值的详细信息记录在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标头。

最佳

RequestHeader 指令

描述:配置HTTP请求标头
句法:RequestHeader add|append|edit|edit*|merge|set|setifempty|unset header [[expr=]value [replacement] [early|env=[!]varname|expr=expression]]
内容:服务器配置,虚拟主机,目录,.htaccess
覆写:文件信息
状态:延期
模块:mod_headers
兼容性:SetIfEmpty在2.4.7和更高版本中可用,expr = value在2.4.10和更高版本中可用

该指令可以替换,合并,更改或删除HTTP请求标头。标头在内容处理程序运行之前被修改,允许传入的标头被修改。它执行的操作由第一个参数确定。这可以是以下值之一:

add
即使此标头已经存在,请求标头也会添加到现有的标头集中。这可能导致两个(或多个)具有相同名称的标头。这可能会导致无法预见的后果,一般setappend还是merge应该使用。
append
请求标头会附加到任何现有的同名标头中。当新值合并到现有标头中时,将其与现有标头用逗号分隔。这是给标头提供多个值的HTTP标准方法。
edit
edit*
如果此请求标头存在,则其值将根据正则表达式 搜索并转换。所述参数是一个正则表达式,而替换 为替换字符串,其可以包含反向引用或格式说明。该edit形式将匹配,并在报头值完全更换一次,而edit*表格将取代 所有的搜索模式的实例,如果它出现不止一次。
merge
除非要添加的值已经出现在现有标头的逗号分隔值列表中,否则请求标头将附加到任何同名的现有标头中。当新值合并到现有标头中时,将其与现有标头用逗号分隔。这是给标头提供多个值的HTTP标准方法。在区分所有格式说明符后,将以区分大小写的方式比较值。双引号中的值被认为不同于其他相同的未引号。
set
设置了请求标头,用该名称替换了以前的所有标头
setifempty
设置请求标头,但前提是之前没有使用该名称的标头。
在2.4.7及更高版本中可用。
unset
如果该名称的请求标头存在,则将其删除。如果有多个同名标题,则将全部删除。 必须省略。

此参数后跟标题名称,该名称可以包含最后的冒号,但这不是必需的。大小写被忽略。为setappendmergeadd一个被给定为第三个参数。如果 包含空格,则应该用双引号将其引起来。对于unset,不应该给出任何可以是字符串,包含格式说明符的字符串或两者的组合。受支持的格式说明符与相同Header,请在此处查看有关详细信息。对于edit既是价值更换是必要的,并且是一个正则表达式和替换字符串。

RequestHeader指令后面可以有一个附加参数,可以是以下任何一个:

early
指定早期处理
env=[!]varname
当且仅当环境变量 varname存在时,才应用该指令。!前面的A varname会使测试反向,因此该指令仅在varname未设置的情况下适用。
expr=expression
当且仅当expression的 计算结果为true时,才应用该指令。表达式语法和求值的详细信息记录在ap_expr文档中。

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

可用语言: zh  |  fr  |  ja  |  KO 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。