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;"