文件
一個 項目

標頭

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