文件
一個 專案

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