| 描述: | 自定义HTTP请求和响应头 |
|---|---|
| 状态: | 延期 |
| 模块标识符: | headers_module |
| 源文件: | mod_headers.c |
该模块提供指令来控制和修改HTTP请求和响应头。标头可以合并,替换或删除。
所提供的指令mod_headers几乎可以在服务器配置中的任何位置出现,并且可以通过将其包含在配置节中来限制其范围。
处理的顺序很重要,并且受配置文件中的顺序以及配置部分中的放置位置的影响。如果相反,这两个指令具有不同的效果:
RequestHeader append MirrorID "mirror 12" RequestHeader unset MirrorID
这样一来,MirrorID就不会设置标题。如果反转,则MirrorID标头设置为“镜像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.
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
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 |
| 覆写: | 文件信息 |
| 状态: | 延期 |
| 模块: | 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客户端)。例如,假设您有一个简单的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}的示例。
它执行的操作由第一个参数确定(如果指定了条件,则由第二个参数确定)。这可以是以下值之一:
在开始阅读操作列表之前,请阅读上述always
与onsuccess标头列表之间的区别,因为该重要概念仍然适用。实际上,每个动作均按说明进行工作,但仅在目标标头列表上。
addset,
append还是merge应该使用。appendechoeditedit*edit形式将匹配,并在报头值完全更换一次,而edit*表格将取代
所有的搜索模式的实例,如果它出现不止一次。mergesetsetifemptysetifempty评估时标头不是响应的一部分。set像下面的示例一样,更安全地用于此用例:
Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}"
unsetnote此参数后跟标题名称,该名称可以包含最后的冒号,但这不是必需的。Case是忽略不计set,append,merge,
add,unset和edit。的报头进行名称echo
是大小写敏感的,并且可以是正则表达式。
为set,append,merge和
add一个值被指定为下一个参数。如果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>:
Header set foo-checksum "expr=%{md5:foo}"
因为edit既有一个值参数,它是一个正则表达式,又有一个附加的替换字符串。从版本2.4.7开始,替换字符串也可能包含格式说明符。
该Header指令后面可以有一个附加参数,可以是以下任何一个:
earlyenv=[!]varnamevarname存在时,才应用该指令。!前面的A 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 |
| 覆写: | 文件信息 |
| 状态: | 延期 |
| 模块: | mod_headers |
| 兼容性: | SetIfEmpty在2.4.7和更高版本中可用,expr = value在2.4.10和更高版本中可用 |
该指令可以替换,合并,更改或删除HTTP请求标头。标头在内容处理程序运行之前被修改,允许传入的标头被修改。它执行的操作由第一个参数确定。这可以是以下值之一:
addset,
append还是merge应该使用。appendeditedit*edit形式将匹配,并在报头值完全更换一次,而edit*表格将取代
所有的搜索模式的实例,如果它出现不止一次。mergesetsetifemptyunset此参数后跟标题名称,该名称可以包含最后的冒号,但这不是必需的。大小写被忽略。为set,append,merge和
add一个值被给定为第三个参数。如果
值包含空格,则应该用双引号将其引起来。对于unset,不应该给出任何值。
值可以是字符串,包含格式说明符的字符串或两者的组合。受支持的格式说明符与相同Header,请在此处查看有关详细信息。对于edit既是价值和更换是必要的,并且是一个正则表达式和替换字符串。
该RequestHeader指令后面可以有一个附加参数,可以是以下任何一个:
earlyenv=[!]varnamevarname存在时,才应用该指令。!前面的A varname会使测试反向,因此该指令仅在varname未设置的情况下适用。expr=expression除早期模式外,
RequestHeader伪指令仅在修复阶段由其处理程序运行之前处理。这应该允许浏览器或Apache输入过滤器生成的标头被覆盖或修改。