HTTP標頭字段提供有關請求或回應的所需資訊,或有關在消息正文中發送的對象的資訊。HTTP消息頭有四種類型 -
- 通用標頭 - 這些標頭字段具有用於請求和回應消息的一般適用性。
- 客戶端請求標頭 - 這些標頭字段僅適用於請求消息。
- 伺服器回應標頭 - 這些標頭字段僅適用於回應消息。
- 實體標頭 - 這些標頭字段定義有關實體主體的元資訊,或者如果主體不存在,則定義元資訊。
1. 通用標頭
下麵讓我們詳細介紹通用標頭。
Cache-control
Cache-Control
字段用於指定所有緩存系統必須遵守的指令。語法如下 -
Cache-Control : cache-request-directive|cache-response-directive
HTTP客戶端或伺服器可以使用Cache-control
通用標頭來指定緩存的參數或從緩存中請求某些類型的文檔。緩存指令在逗號分隔列表中指定。例如 -
Cache-control: no-cache
客戶端在HTTP請求中可以使用以下重要的緩存請求指令 -
編號 | 指令 | 描述 |
---|---|---|
1 | no-cache |
如果未成功重新驗證源伺服器,則緩存不得使用回應來滿足後續請求。 |
2 | no-store |
緩存不應存儲有關客戶端請求或伺服器回應的任何內容。 |
3 | max-age = seconds |
表示客戶端願意接受時長不大於指定時間(秒)的回應。 |
4 | max-stale [ = seconds ] |
表示客戶端願意接受超過其到期時間的回應。如果給出秒數,則不得超過該時間。 |
5 | min-fresh = seconds |
表示客戶端願意接受其新生命週期不小於其當前時長加上指定時間(秒)的回應。 |
6 | no-transform |
不要轉換實體主體。 |
7 | only-if-cached |
不要檢索新數據。緩存只有在緩存中才能發送文檔,並且不應該聯繫源伺服器以查看是否存在較新的副本。 |
伺服器在其HTTP回應中可以使用以下緩存回應指令 -
編號 | 緩存請求指令 | 描述 |
---|---|---|
1 | public |
表示任何緩存都可以緩存回應。 |
2 | private |
指示回應消息的全部或部分內容僅供單個用戶使用,並且不得由共用高速緩存進行高速緩存。 |
3 | no-cache |
如果未成功重新驗證源伺服器,則高速緩存不得使用回應來滿足後續請求。 |
4 | no-store |
緩存不應存儲有關客戶端請求或伺服器回應的任何內容。 |
5 | no-transform |
不要轉換實體主體。 |
6 | must-revalidate |
緩存必須在使用之前驗證過時文檔的狀態,並且不應使用過期文檔。 |
7 | proxy-revalidate |
proxy-revalidate 指令與must-revalidate 指令具有相同的含義,但它不適用於非共用用戶代理緩存。 |
8 | max-age = seconds |
表示客戶端願意接受時長不大於指定時間(秒)的回應。 |
9 | s-maxage = seconds |
此指令指定的最大時長將覆蓋max-age 指令或Expires 標頭指定的最大期限。私有緩存始終忽略s-maxage 指令。 |
Connection
Connection
字段允許發送方指定該特定連接所需的選項,並且不能由代理通過其他連接進行通信。以下是使用連接頭的簡單語法 -
Connection : "Connection"
HTTP/1.1
定義了“關閉”連接選項,發送方在完成回應後發出連接將被關閉的信號。例如 -
Connection: close
默認情況下,HTTP 1.1使用持久連接,其中連接在事務後不會自動關閉。另一方面,HTTP 1.0
默認情況下沒有持久連接。如果1.0客戶端希望使用持久連接,則它使用keep-alive
參數,如下所示 -
Connection: keep-alive
Date
所有HTTP日期/時間戳必須以格林威治標準時間(GMT)表示。允許HTTP應用程式使用以下三種日期/時間戳表示 -
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123
Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036
Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
這裏的第一種格式是最優選的格式。
Pragma
Pragma
字段用於包含可能適用於請求/回應鏈中任何收件人的特定於實現的指令。例如 -
Pragma: no-cache
HTTP/1.0
中定義的唯一指令是no-cache
指令,並在HTTP/1.1中維護以實現向後相容。將來不會定義新的Pragma
指令。
Trailer
Trailer
字段值指示給定的標頭字段集存在於用分塊傳輸編碼編碼的消息的尾部中。以下是使用Trailer
標頭字段的簡單語法 -
Trailer : field-name
Trailer
標頭字段中列出的消息標頭字段不得包含以下標頭字段 -
Transfer-Encoding
Content-Length
Trailer
Transfer-Encoding
Transfer-Encoding
標頭字段指示已對消息正文應用了哪種類型的轉換,以便在發件人和收件人之間安全地進行轉換。這與內容編碼不同,因為傳輸編碼是消息的屬性,而不是實體主體的屬性。以下語法顯示使用Transfer-Encoding
標頭字段 -
Transfer-Encoding: chunked
所有傳輸編碼值都不區分大小寫。
Upgrade
Upgrade
標頭允許客戶端指定它支持的其他通信協議,並且如果伺服器發現它適合切換協議,則希望使用它們。例如 -
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Upgrade
頭字段旨在提供一種從HTTP/1.1
轉換到其他不相容協議的簡單機制。
Via
網關和代理必須使用Via通用標頭來指示中間協議和接收方。例如,可以將請求消息從HTTP/1.0
用戶代理發送到代號為fred
的內部代理,該代理使用HTTP/1.1
將請求轉發到nowhere.com
上的公共代理,該代理完成請求 通過https://www.ics.uci.edu/
將其轉發到源伺服器。www.ics.uci.edu
收到的請求將具有以下Via
頭字段 -
Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Upgrade
標頭字段旨在提供一種從HTTP/1.1
轉換到其他不相容協議的簡單機制
Warning
Warning
通用標頭用於攜帶有關消息狀態或轉換的其他資訊,這些資訊可能不會反映在消息中。回應可能帶有多個警告標頭。
Warning : warn-code SP warn-agent SP warn-text SP warn-date
2. 客戶請求標頭
Accept
Accept
請求標頭字段可用於指定回應可接受的某些媒體類型。以下是一般語法 -
Accept: type/subtype [q = qvalue]
可以用逗號分隔多種媒體類型,可選的qvalue
代表0
到1
等級的接受類型的可接受品質等級。以下是一個示例 -
Accept: text/plain; q = 0.5, text/html, text/x-dvi; q = 0.8, text/x-c
這將被解釋為text/html
和text/x-c
是首選媒體類型,但如果它們不存在,則發送text/x-dvi
實體,如果不存在,則發送text/plain
實體。
Accept-Charset
Accept-Charset
請求標頭字段可用於指示回應可接受的字元集。以下是一般語法 -
Accept-Charset: character_set [q = qvalue]
可以用逗號分隔多個字元集,可選的qvalue
表示非優先字元集的可接受品質級別,範圍為0
到1
。以下是一個示例 -
Accept-Charset: iso-8859-5, unicode-1-1; q = 0.8
特殊值*
(如果存在於Accept-Charset
字段中)與每個字元集匹配,如果不存在Accept-Charset
標頭,則默認值為任何字元集都可接受。
Accept-Encoding
Accept-Encoding
請求標頭字段類似於Accept
,但限制回應中可接受的內容編碼。以下是一般語法 -
Accept-Encoding: encoding types
以下是示例 -
Accept-Encoding: compress, gzip
Accept-Encoding:
Accept-Encoding: *
Accept-Encoding: compress;q = 0.5, gzip;q = 1.0
Accept-Encoding: gzip;q = 1.0, identity; q = 0.5, *;q = 0
Accept-Language
Accept-Language
請求標頭字段與Accept
類似,但限制首選的自然語言集作為對請求的回應。以下是一般語法 -
Accept-Language: language [q = qvalue]
可以用逗號分隔多種語言,可選的qvalue
表示非優選語言的可接受品質級別,範圍為0
到1
。以下是一個示例 -
Accept-Language: da, en-gb;q = 0.8, en;q = 0.7
Authorization
Authorization
請求標頭字段值包含包含所請求資源領域的用戶代理的認證資訊的憑證。以下是一般語法 -
Authorization : credentials
HTTP/1.0
規範定義了BASIC授權方案,其中授權參數是username:password
以base 64編碼的字串。以下是一個示例 -
Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM =
值解析為guest:guest123
,其中guest
是用戶ID,guest123
是密碼。
Cookie
Cookie
請求標頭字段值包含為該URL存儲的名稱/值對資訊。以下是一般語法 -
Cookie: name = value
可以用分號分隔多個cookie
,如下所示 -
Cookie: name1 = value1;name2 = value2;name3 = value3
Expect
Expect
請求標頭字段用於指示客戶端需要特定的伺服器行為。以下是一般語法 -
Expect : 100-continue | expectation-extension
如果伺服器收到包含Expect
字段的請求,該字段包含它不支持的期望擴展,則它必須以417(期望失敗)狀態回應。
From
From
請求標頭字段包含控制請求用戶代理的人類用戶的Internet電子郵件地址。以下是一個簡單的例子 -
From: webmaster@w3.org
From
請求標頭字段可以用於記錄目的,並且可以用作識別無效或不需要的請求的源的手段。
Host
Host
請求標頭字段用於指定所請求資源的Internet主機和端口號。以下是一般語法 -
Host : "Host" ":" host [ ":" port ] ;
沒有任何尾隨端口信息的主機則使用默認端口,即80
。例如,原始伺服器上http://www.w3.org/pub/WWW/
的請求將是 -
GET /pub/WWW/ HTTP/1.1
Host: www.w3.org
If-Match
If-Match
請求標頭字段與方法一起使用以使其成為條件。僅當此標記中的給定值與ETag
表示的給定實體標記匹配時,此標頭才請求伺服器執行所請求的方法。以下是一般語法 -
If-Match : entity-tag
星號(*
)匹配任何實體,僅當實體存在時,事務才會繼續。以下是可能的例子 -
If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *
如果沒有實體標籤匹配,或者如果給出*
並且不存在當前實體,則伺服器不能執行所請求的方法,並且必須返回412(Precondition Failed)回應。
If-Modified-Since
If-Modified-Since
請求標頭字段與方法一起使用以使其成為條件。如果自該字段中指定的時間以來未請求修改請求的URL,則不會從伺服器返回實體; 相反,將返回304(未修改)回應,而不返回任何消息體。以下是一般語法 -
If-Modified-Since : HTTP-date
另一個示例如下 -
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果沒有實體標籤匹配,或者如果給出*
並且不存在當前實體,則伺服器不能執行所請求的方法,並且必須返回412(Precondition Failed)回應。
If-None-Match
If-None-Match
請求標頭字段與方法一起使用以使其成為條件。僅當此標記中的給定值之一與ETag
表示的給定實體標記匹配時,此標頭才請求伺服器執行所請求的方法。以下是一般語法 -
If-None-Match : entity-tag
星號(*
)匹配任何實體,僅當實體不存在時,事務才會繼續。以下是可能的例子 -
If-None-Match: "xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: *
If-Range
If-Range
請求標頭字段可以與條件GET一起使用,以僅請求缺少的實體部分(如果尚未更改),以及整個實體(如果已更改)。以下是一般語法 -
If-Range : entity-tag | HTTP-date
可以使用實體標籤或日期來標識已經接收的部分實體。例如 -
If-Range: Sat, 29 Oct 1994 19:43:31 GMT
這裏,如果文檔自給定日期以來未被修改,則伺服器返回Range
頭部給出的位元組範圍,否則返回所有新文檔。
If-Unmodified-Since
If-Unmodified-Since
請求標頭字段與方法一起使用以使其成為條件。以下是一般語法 -
If-Unmodified-Since : HTTP-date
如果這個字段中指定的時間以來未請求修改所請求的資源,則伺服器應執行所請求的操作,就像If-Unmodified-Since
標頭不存在一樣。例如 -
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果請求通常會導致2xx
或412
狀態之外的任何其他內容,則應忽略If-Unmodified-Since
標頭。
Max-Forwards
Max-Forwards
請求標頭字段提供了一種使用TRACE
和OPTIONS
方法的機制,以限制可以將請求轉發到下一個入站伺服器的代理或網關的數量。以下是一般語法 -
Max-Forwards : n
Max-Forwards
值是十進位整數,表示可以轉發此請求消息的剩餘次數。這對於使用TRACE
方法進行調試非常有用,可以避免無限迴圈。例如 -
Max-Forwards : 5
對於HTTP規範中定義的所有其他方法,可以忽略Max-Forwards
頭字段。
Proxy-Authorization
Proxy-Authorization
請求標頭字段允許客戶端將自己(或其用戶)標識到需要認證的代理。以下是一般語法 -
Proxy-Authorization : credentials
Proxy-Authorization
字段值包含包含代理的用戶代理的身份驗證資訊和/或所請求資源的域的憑證。
Range
Range
請求標頭字段指定從文檔請求的內容的部分範圍。以下是一般語法 -
Range: bytes-unit = first-byte-pos "-" [last-byte-pos]
byte-range-spec
中的first-byte-pos
值給出了一個範圍內第一個位元組的位元組偏移量。last-byte-pos
值給出範圍中最後一個位元組的位元組偏移量; 也就是說,指定的位元組位置是包含的。可以將位元組單位指定為位元組位元組偏移量從零開始。以下是一個簡單的例子 -
- The first 500 bytes
Range: bytes = 0-499
- The second 500 bytes
Range: bytes = 500-999
- The final 500 bytes
Range: bytes = -500
- The first and last bytes only
Range: bytes = 0-0,-1
可以列出多個範圍,以逗號分隔。如果缺少以逗號分隔的位元組範圍中的第一個數字,則假定該範圍從文檔的末尾開始計數。如果缺少第二個數字,則範圍是文檔末尾的位元組n
。
Referer
Referer
請求標頭字段允許客戶端指定從中請求URL的資源的地址(URI)。以下是一般語法 -
Referer : absoluteURI | relativeURI
以下是一個簡單的例子 -
Referer: http://www.zaixian.org/http/index.html
如果字段值是相對URI,則應相對於Request-URI
進行解釋。
TE
TE請求頭字段指示它在回應中願意接受的擴展傳輸編碼以及它是否願意接受分塊傳輸編碼中的尾部字段。以下是一般語法 -
TE: t-codings
關鍵字trailers
存在表明客戶端願意接受分塊傳輸編碼中的trailers
字段,並指定其中一種方式 -
TE: deflate
TE:
TE: trailers, deflate;q = 0.5
如果TE
字段值為空或者如果不存在TE
字段,則僅對傳輸編碼進行分塊。沒有傳輸編碼的消息總是可以接受的。
User-Agent
User-Agent
請求標頭字段包含有關發起請求的用戶代理的資訊。以下是一般語法 -
User-Agent : product | comment
示例:
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
伺服器回應標頭
Accept-Ranges
Accept-Ranges
回應頭字段允許伺服器指示其接受資源的範圍請求。以下是一般語法 -
Accept-Ranges : range-unit | none
例如,接受位元組範圍請求的伺服器可以發送 -
Accept-Ranges: bytes
不接受任何資源範圍請求的伺服器可以發送 -
Accept-Ranges: none
它將建議客戶不要嘗試範圍請求。
Age
Age
回應頭字段傳達發送方對自原始伺服器生成回應(或其重新驗證)以來的時間量的估計。以下是一般語法 -
Age : delta-seconds
Age
值是非負十進位整數,表示以秒為單位的時間。以下是一個簡單的例子 -
Age: 1030
包含緩存的HTTP/1.1
伺服器必須在從其自己的緩存生成的每個回應中包含Age
頭字段。
ETag
ETag
回應標頭字段提供所請求變體的實體標籤的當前值。以下是一般語法 -
ETag : entity-tag
以下是簡單的例子 -
ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""
Location
Location
回應標頭字段用於將收件人重定向到Request-URI
以外的位置以完成。以下是一般語法 -
Location : absoluteURI
以下是一個簡單的例子 -
Location: http://www.zaixian.org/http/index.html
Content-Location
頭字段與Location
的不同之處在於Content-Location
標識請求中包含的實體的原始位置。
Proxy-Authenticate
Proxy-Authenticate
回應頭字段必須作為407(需要代理身份驗證)回應的一部分包含在內。以下是一般語法 -
Proxy-Authenticate : challenge
Retry-After
Retry-After
回應頭字段可以與503(服務不可用)回應一起使用,以指示服務預期對請求客戶端不可用的時間。以下是一般語法 -
Retry-After : HTTP-date | delta-seconds
以下是兩個簡單的例子 -
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120
在後一個例子中,延遲是2分鐘。
Server
Server
回應標頭字段包含有關源伺服器用於處理請求的軟體的資訊。以下是一般語法 -
Server : product | comment
以下是一個簡單的例子 -
Server: Apache/2.2.14 (Win32)
如果通過代理轉發回應,則代理應用程式不得修改Server
回應標頭。
Set-Cookie
Set-Cookie
回應頭字段包含要為此URL保留的名稱/值對資訊。以下是一般語法 -
Set-Cookie: NAME = VALUE; OPTIONS
Set-Cookie
回應頭包括令牌Set-Cookie:,
後跟逗號分隔的一個或多個cookie
列表。以下是指定為選項的可能值 -
編號 | 選項 | 描述 |
---|---|---|
1 | Comment = comment |
此選項可用於指定與cookie 關聯的注釋。 |
2 | Domain = domain |
Domain 屬性指定cookie 有效的域。 |
3 | Expires = Date-time |
Cookie過期的日期。如果它是空白,則訪問者退出流覽器時cookie將過期。 |
4 | Path = path |
Path 屬性指定此cookie 適用的URL子集。 |
5 | Secure |
它指示用戶代理僅在安全連接下返回cookie。 |
以下是伺服器生成的簡單cookie
標頭的示例 -
Set-Cookie: name1 = value1,name2 = value2; Expires = Wed, 09 Jun 2021 10:18:14 GMT
Vary
Vary
回應頭字段指定實體具有多個源,因此可以根據指定的請求頭列表而變化。以下是一般語法 -
Vary : field-name
可以指定由逗號分隔的多個標頭,並且值為星號*
表示未指定的參數不限於請求標頭。以下是一個簡單的例子 -
Vary: Accept-Language, Accept-Encoding
WWW-Authenticate
WWW-Authenticate
回應頭字段必須包含在401(未授權)回應消息中。字段值包括至少一個challenge
,該challenge
指示適用於Request-URI
的認證方案和參數。以下是一般語法 -
WWW-Authenticate: BASIC realm = "Admin"
3. 實體標頭
Allow
Allow
實體標頭字段列出Request-URI
標識的資源支持的方法集。以下是一般語法 -
Allow : Method
可以指定以逗號分隔的多個方法。以下是一個簡單的例子 -
Allow: GET, HEAD, PUT
此字段無法阻止客戶端嘗試其他方法。
Content-Encoding
Content-Encoding
實體標頭字段用作媒體類型的修飾符。以下是一般語法 -
Content-Encoding : content-coding
內容編碼是Request-URI
標識的實體的特徵。以下是一個簡單的例子 -
Content-Encoding: gzip
如果請求消息中的實體的內容編碼對於源伺服器是不可接受的,則伺服器應該以狀態代碼415(不支持的媒體類型)進行回應。
Content-Language
Content-Language
實體標頭字段描述了所包含實體的目標受眾的自然語言。以下是一般語法 -
Content-Language : language-tag
可以針對針對多個受眾的內容列出多種語言。以下是一個簡單的例子 -
Content-Language: mi, en
內容語言的主要目的是允許用戶根據用戶自己的首選語言識別和區分實體。
Content-Length
Content-Length
實體標頭字段指示實體主體的大小,以十進位數量的OCTET
發送給接收者,或者在HEAD方法的情況下,實體主體的大小已經發送到GET請求。以下是一般語法 -
Content-Length : DIGITS
以下是一個簡單的例子 -
Content-Length: 3495
任何大於或等於零的Content-Length
都是有效值。
Content-Location
當該實體可從與所請求資源的URI分開的位置訪問時,Content-Location
實體標頭字段可用於為消息中包含的實體提供資源位置。以下是一般語法 -
Content-Location: absoluteURI | relativeURI
以下是一個簡單的示例 -
Content-Location: http://www.zaixian.org/http/index.html
Content-Location
的值還定義了實體的基URI。
Content-MD5
Content-MD5
實體標頭字段可用於提供實體的MD5摘要,用於在接收時檢查消息的完整性。以下是一般語法 -
Content-MD5 : md5-digest using base64 of 128 bit MD5 digest as per RFC 1864
以下是一個簡單的例子 -
Content-MD5 : 8c2d46911f3f5a326455f0ed7a8ed3b3
MD5摘要是基於實體主體的內容計算的,包括已應用的任何內容編碼,但不包括應用於消息主體的任何傳輸編碼。
Content-Range
Content-Range
實體標頭字段與部分實體主體一起發送,以指定應在整個實體主體中應用部分主體的位置。以下是一般語法 -
Content-Range : bytes-unit SP first-byte-pos "-" last-byte-pos
假設實體包含總共2233
個位元組的byte-content-range-spec
值的示例 -
- The first 500 bytes:
Content-Range : bytes 0-499/2233
- The second 500 bytes:
Content-Range : bytes 500-999/2233
- All except for the first 500 bytes:
Content-Range : bytes 500-1233/2233
- The last 500 bytes:
Content-Range : bytes 734-1233/2233
當HTTP消息包括單個範圍的內容時,該內容與Content-Range
標頭一起傳輸,Content-Length
標頭顯示實際傳輸的位元組數。例如,
HTTP/1.1 206 Partial content
Date: Wed, 15 Nov 1995 06:25:24 GMT
Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
Content-Type
Content-Type
實體標頭字段指示發送給接收方的實體主體的媒體類型,或者在HEAD
方法的情況下,指示在請求是GET
時已經發送的媒體類型。以下是一般語法 -
Content-Type : media-type
下麵是一個簡單的示例 -
Content-Type: text/html; charset = ISO-8859-4
Expires
Expires
實體標頭字段給出了回應值被視為是過時的日期/時間。以下是一般語法 -
Expires : HTTP-date
下麵是一個簡單的示例 -
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified
Last-Modified
實體標頭字段指示源伺服器認為變體上次修改的日期和時間。以下是一般語法 -
Last-Modified: HTTP-date
以下是一個簡單的示例 -
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT