HTTP檔頭欄位

2019-10-16 22:03:40

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: [email protected]

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.yiibai.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.yiibai.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.yiibai.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