header
操作 HTTP 回應標頭欄位。它可以設定、新增和刪除標頭值,或使用正則表達式執行替換。
預設情況下,標頭操作會立即執行,除非任何標頭正在被刪除(-
前綴)或設定預設值(?
前綴)。在這些情況下,標頭操作會自動延遲到它們被寫入客戶端時。
若要操作 HTTP 請求標頭,您可以使用 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> 是標頭欄位的名稱。
沒有前綴,欄位會被設定(覆寫)。
使用
+
作為前綴來新增欄位,而不是在欄位已存在時覆寫(設定)欄位;標頭欄位可以在請求中出現多次。使用
-
作為前綴來刪除欄位。該欄位可以使用前綴或後綴*
通配符來刪除所有匹配的欄位。使用
?
作為前綴來設定欄位的預設值。只有在欄位尚不存在時才會寫入。使用
>
作為前綴來設定欄位,並啟用defer
作為快捷方式。 -
<value> 是標頭欄位的值,當新增或設定欄位時。
-
<find> 是要搜尋的子字串或正則表達式。
-
<replace> 是替換值;執行搜尋和替換時是必需的。使用
$1
或$2
等來引用搜尋模式中的捕獲群組。如果替換值為""
,則匹配的文字會從值中移除。請參閱 Go 文件 以取得詳細資訊。 -
defer 將強制標頭操作延遲到回應寫出到客戶端時。如果任何標頭欄位正在使用
-
刪除、使用?
設定預設值或使用>
前綴,則會自動啟用此功能。
對於多個標頭操作,您可以開啟一個區塊,並以相同的方式在每行中指定一個操作。
當使用 ?
前綴設定預設標頭值時,如果它在具有多個標頭操作的 header
區塊中,它會自動分隔到自己的 header
處理程序中。 在底層,使用 ?
配置一個 回應匹配器,該匹配器適用於指令的整個處理程序,該處理程序僅應用標頭操作(如 defer
),但僅在欄位尚未設定時才應用。
範例
在所有請求上設定自訂標頭欄位
header Custom-Header "My value"
移除 "Hidden" 標頭欄位
header -Hidden
在任何 Location 標頭中將 http://
替換為 https://
header Location http:// https://
在所有頁面上設定安全性和隱私標頭:(警告: 僅在您了解其含義時使用!)
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
}
多個標頭指令,旨在互斥
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 /no-cache* >Cache-Control nocache
reverse_proxy upstream:443
執行 Set-Cookie
標頭的延遲更新以新增 SameSite=None
;正則表達式捕獲用於抓取現有值,而 $1
將其重新插入到開頭,並附加額外的選項
header >Set-Cookie (.*) "$1; SameSite=None;"