文档
一个 项目

header

操作 HTTP 响应头字段。它可以设置、添加和删除头值,或使用正则表达式执行替换。

默认情况下,header 操作会立即执行,除非有任何头被删除(以 - 为前缀)或设置默认值(以 ? 为前缀)。在这些情况下,头操作会自动延迟直到写入客户端时执行。

要操作 HTTP 请求头,可使用 request_header 指令。

语法

header [<matcher>] [[+|-|?|>]<field> [<value>|<find>] [<replace>]] {
	# 添加
	+<field> <value>

	# 设置
	<field> <value>

	# 使用延迟设置
	><field> <value>

	# 删除
	-<field>

	# 替换
	<field> <find> <replace>

	# 使用延迟替换
	><field> <find> <replace>

	# 默认值
	?<field> <value>

	[defer]

	match <inline_response_matcher>
}
  • <field> 是头字段的名称。

    无前缀时,字段会被设置(覆盖)。

    使用 + 前缀以添加字段而不是覆盖(设置)已有字段;响应中同一头字段可以出现多次。

    使用 - 前缀以删除字段。字段名可以使用前缀或后缀的 * 通配符以删除所有匹配字段。

    使用 ? 前缀以设置字段的默认值。仅在字段尚未存在时才会写入该值。

    使用 > 前缀以设置字段并启用 defer,作为快捷方式。

  • <value> 是在添加或设置字段时的头字段值。

  • <find> 是要搜索的子串或正则表达式。

  • <replace> 是替换值;如果执行查找并替换操作则必需。使用 $1$2 等来引用搜索模式中的捕获组。如果替换值为 "",则匹配到的文本将从值中删除。详情请参阅 Go 文档

  • defer 将头操作的执行延迟到响应发送给客户端时。以下情况会自动启用此选项:

    • 使用 - 删除任何头字段时。
    • 使用 ? 设置默认值时。
    • 在设置或替换操作上使用 > 前缀时。
    • 存在一个或多个 match 条件时。
  • match 是一个内联的 响应匹配器。头操作仅应用于满足指定条件的响应。

对于多个头操作,你可以打开一个块,并在其中每行按相同方式指定一个操作。

当使用 ? 前缀设置默认头值时,如果它位于包含多个头操作的 header 块中,会自动将其分离到自己的 header 处理器中。在底层,使用 ? 会配置一个 响应匹配器,该匹配器应用于指令的整个处理器(这仅应用于头操作,如 defer),但仅在字段尚未设置时才会应用。

示例

在所有响应上设置自定义头字段:

header Custom-Header "My value"

删除 "Hidden" 头字段:

header -Hidden

将任何 Location 头中的 http:// 替换为 https://

header Location http:// https://

在所有页面上设置安全和隐私头:(警告: 仅在你理解其影响时使用!)

header {
	# 禁用 FLoC 跟踪
	Permissions-Policy interest-cohort=()

	# 启用 HSTS
	Strict-Transport-Security max-age=31536000;

	# 禁止客户端嗅探媒体类型
	X-Content-Type-Options nosniff

	# 防止点击劫持
	X-Frame-Options DENY
}

打算互斥使用的多个 header 指令:

route {
	header           Cache-Control max-age=3600
	header /static/* Cache-Control max-age=31536000
}

如果上游未定义,设置默认的缓存过期时间:

header ?Cache-Control "max-age=3600"
reverse_proxy upstream:443

将对 GET 请求的所有成功响应标记为最多可缓存一小时:

@GET method GET
header @GET Cache-Control "max-age=3600" {
	match status 2xx
}
reverse_proxy upstream:443

在上游服务器发生异常时,防止对错误响应进行缓存:

header {
	-Cache-Control
	-CDN-Cache-Control
	match status 500
}
reverse_proxy upstream:443

如果上游服务器支持客户端提示,则将浅色模式响应与深色模式响应分别标记为可单独缓存:

header {
	Cache-Control "max-age=3600"
	Vary "Sec-CH-Prefers-Color-Scheme"
	match {
		header Accept-CH "*Sec-CH-Prefers-Color-Scheme*"
		header Critical-CH "Sec-CH-Prefers-Color-Scheme"
	}
}
reverse_proxy upstream:443

通过将通配符值替换为特定域名来防止过于宽松的 CORS 头:

header >Access-Control-Allow-Origin "\*" "allowed-partner.com"
reverse_proxy upstream:443

注意:在替换操作中,<find> 值会被解释为正则表达式。要匹配 * 字符,必须像上例那样使用反斜杠转义。

或者,你可以使用 响应匹配器逐字匹配头值:

header Access-Control-Allow-Origin "allowed-partner.com" {
	match header Access-Control-Allow-Origin *
}
reverse_proxy upstream:443

要覆盖代理上游为以 /no-cache 开头的路径设置的缓存过期时间;需要启用 defer 以确保该头在代理写入其头之后被设置:

header /no-cache* >Cache-Control no-cache
reverse_proxy upstream:443

要对 Set-Cookie 头进行延迟更新以添加 SameSite=None;使用正则捕获来获取现有值,$1 将其重新插入到开头并附加额外选项:

header >Set-Cookie (.*) "$1; SameSite=None;"