header
操作 HTTP 响应 header 字段。它可以设置、添加和删除 header 值,或使用正则表达式执行替换。
默认情况下,header 操作会立即执行,除非正在删除任何 header(-
前缀)或设置默认值(?
前缀)。在这些情况下,header 操作会自动延迟到写入客户端时。
要操作 HTTP 请求 header,您可以使用 request_header
指令。
语法
header [<matcher>] [[+|-|?|>]<field> [<value>|<find>] [<replace>]] {
# Add
+<field> <value>
# Set
<field> <value>
# Set with defer
><field> <value>
# Delete
-<field>
# Replace
<field> <find> <replace>
# Replace with defer
><field> <find> <replace>
# Default
?<field> <value>
[defer]
}
-
<field> 是 header 字段的名称。
没有前缀时,该字段将被设置(覆盖)。
使用
+
前缀添加字段,而不是在字段已存在时覆盖(设置)该字段;header 字段可以在请求中出现多次。使用
-
前缀删除字段。该字段可以使用前缀或后缀*
通配符删除所有匹配的字段。使用
?
前缀为字段设置默认值。该字段仅在尚不存在时写入。使用
>
前缀设置字段,并启用defer
,作为快捷方式。 -
<value> 是 header 字段值,在添加或设置字段时。
-
<find> 是要搜索的子字符串或正则表达式。
-
<replace> 是替换值;执行搜索和替换时是必需的。使用
$1
或$2
等来引用搜索模式中的捕获组。如果替换值为""
,则匹配的文本将从值中删除。有关详细信息,请参阅 Go 文档。 -
defer 将强制 header 操作延迟到响应写入客户端时。当使用
-
删除任何 header 字段、使用?
设置默认值或使用>
前缀时,将自动启用此功能。
对于多个 header 操作,您可以打开一个块,并以相同的方式在每行指定一个操作。
当使用 ?
前缀设置默认 header 值时,如果它在包含多个 header 操作的 header
块中,则会自动将其分离到其自己的 header
处理程序中。 在底层,使用 ?
配置一个 响应匹配器,该匹配器应用于指令的整个处理程序,该处理程序仅应用 header 操作(如 defer
),但仅当字段尚未设置时才应用。
示例
在所有请求上设置自定义 header 字段
header Custom-Header "My value"
移除 “Hidden” header 字段
header -Hidden
在任何 Location header 中将 http://
替换为 https://
header Location http:// https://
在所有页面上设置安全和隐私 header:(警告: 仅在您了解其含义时使用!)
header {
# disable FLoC tracking
Permissions-Policy interest-cohort=()
# enable HSTS
Strict-Transport-Security max-age=31536000;
# disable clients from sniffing the media type
X-Content-Type-Options nosniff
# clickjacking protection
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
要覆盖代理上游为以 /no-cache
开头的路径设置的缓存过期时间;启用 defer
是必要的,以确保 header 在代理写入其 header 之后 设置
header /no-cache* >Cache-Control nocache
reverse_proxy upstream:443
要执行 Set-Cookie
header 的延迟更新以添加 SameSite=None
;使用 regexp 捕获来获取现有值,并使用 $1
将其重新插入到开头,并附加额外的选项
header >Set-Cookie (.*) "$1; SameSite=None;"