標頭
操作 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]
}
-
<欄位> 是標頭欄位的名稱。
沒有前綴,欄位會設定 (覆寫)。
加上
+
前綴以新增欄位,而不是覆寫 (設定) 欄位 (如果欄位已存在);標頭欄位可以在要求中出現多次。加上
-
前綴以刪除欄位。欄位可以使用前綴或後綴*
萬用字元來刪除所有符合的欄位。加上
?
前綴以設定欄位的預設值。欄位僅在尚未存在時才寫入。加上
>
前綴以設定欄位,並啟用defer
,作為捷徑。 -
<值> 是新增或設定欄位時的標頭欄位值。
-
<尋找> 是要搜尋的子字串或正規表示法。
-
<替換> 是替換值;如果執行搜尋和替換,則需要。
-
defer 會強制標頭操作延遲到回應寫入至用戶端時才執行。如果使用
-
刪除任何標頭欄位、使用?
設定預設值,或使用>
前綴時,會自動啟用此功能。
對於多個標頭操作,可以開啟區塊,並以相同方式在每行指定一個操作。
使用 ?
前綴設定預設標頭值時,建議將其分隔到自己的 header
指令中。在幕後,使用 ?
會設定回應比對器,適用於指令的整個處理常式,僅在欄位尚未設定時才套用標頭操作。例如,在同一個指令中,有這兩個操作:-Hidden
和 ?Foo default
,則僅在 Foo
為空時才會移除 Hidden
標頭,這通常不是預期的效果。
範例
在所有要求上設定自訂標頭欄位
header Custom-Header "My value"
移除「Hidden」標頭欄位
header -Hidden
在任何位置標頭中將 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;"