HTTP標頭字段

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代表01等級的接受類型的可接受品質等級。以下是一個示例 -

Accept: text/plain; q = 0.5, text/html, text/x-dvi; q = 0.8, text/x-c

這將被解釋為text/htmltext/x-c是首選媒體類型,但如果它們不存在,則發送text/x-dvi實體,如果不存在,則發送text/plain實體。

Accept-Charset

Accept-Charset請求標頭字段可用於指示回應可接受的字元集。以下是一般語法 -

Accept-Charset: character_set [q = qvalue]

可以用逗號分隔多個字元集,可選的qvalue表示非優先字元集的可接受品質級別,範圍為01。以下是一個示例 -

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表示非優選語言的可接受品質級別,範圍為01。以下是一個示例 -

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請求標頭字段值包含為該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

如果請求通常會導致2xx412狀態之外的任何其他內容,則應忽略If-Unmodified-Since標頭。

Max-Forwards

Max-Forwards請求標頭字段提供了一種使用TRACEOPTIONS方法的機制,以限制可以將請求轉發到下一個入站伺服器的代理或網關的數量。以下是一般語法 -

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回應頭字段包含要為此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

上一篇: HTTP協議基礎 下一篇: HTTPS協議基礎