HTTP 快速指南



超文字傳輸協議 (HTTP) 是一種用於分散式、協作式超媒體資訊系統的應用層協議。自 1990 年以來,它是全球資訊網(即網際網路)資料通訊的基礎。HTTP 是一種通用且無狀態的協議,也可以透過擴充套件其請求方法、錯誤程式碼和報頭用於其他目的。

基本上,HTTP 是一種基於 TCP/IP 的通訊協議,用於在全球資訊網上交付資料(HTML 檔案、影像檔案、查詢結果等)。預設埠為 TCP 80,但也可以使用其他埠。它為計算機之間以標準化方式進行通訊提供了一種方法。HTTP 規範指定了客戶端如何構建和傳送資料請求到伺服器,以及伺服器如何響應這些請求。

基本特性

以下三個基本特性使 HTTP 成為一個簡單而強大的協議

  • HTTP 是無連線的:HTTP 客戶端(即瀏覽器)發起 HTTP 請求,請求發出後,客戶端斷開與伺服器的連線並等待響應。伺服器處理請求並重新與客戶端建立連線以傳送響應。

  • HTTP 是媒體無關的:這意味著,只要客戶端和伺服器都知道如何處理資料內容,任何型別的資料都可以透過 HTTP 傳送。這需要客戶端和伺服器使用適當的 MIME 型別來指定內容型別。

  • HTTP 是無狀態的:如上所述,HTTP 是無連線的,這是 HTTP 是一種無狀態協議的直接結果。伺服器和客戶端僅在當前請求期間彼此瞭解。之後,兩者都忘記了對方。由於協議的這種性質,客戶端或瀏覽器都無法在不同網頁的請求之間保留資訊。

HTTP/1.0 每個請求/響應交換使用新的連線,而 HTTP/1.1 連線可用於一個或多個請求/響應交換。

基本架構

下圖顯示了一個 Web 應用程式的非常基本的架構,並描述了 HTTP 的位置

HTTP Architecture

HTTP 協議是一種基於客戶端/伺服器架構的請求/響應協議,其中 Web 瀏覽器、機器人和搜尋引擎等充當 HTTP 客戶端,而 Web 伺服器充當伺服器。

客戶端

HTTP 客戶端透過 TCP/IP 連線以請求方法、URI 和協議版本的形式向伺服器傳送請求,後跟包含請求修改器、客戶端資訊和可能的正文內容的類似 MIME 的訊息。

伺服器

HTTP 伺服器以狀態行響應,包括訊息的協議版本和成功或錯誤程式碼,後跟包含伺服器資訊、實體元資訊和可能的實體正文內容的類似 MIME 的訊息。

HTTP - 引數

本章將列出一些重要的 HTTP 協議引數及其在通訊中使用的語法。例如,日期格式、URL 格式等。這將有助於您在編寫 HTTP 客戶端或伺服器程式時構建請求和響應訊息。在後續章節中解釋 HTTP 請求和響應的訊息結構時,您將看到這些引數的完整用法。

HTTP 版本

HTTP 使用<主版本>.<次版本>編號方案來指示協議的版本。HTTP 訊息的版本由第一行中的 HTTP-Version 欄位指示。以下是指定 HTTP 版本號的通用語法

HTTP-Version   = "HTTP" "/" 1*DIGIT "." 1*DIGIT

示例

HTTP/1.0

or

HTTP/1.1

統一資源識別符號 (URI)

統一資源識別符號 (URI) 是一種格式簡單的、不區分大小寫的字串,包含名稱、位置等資訊,用於標識資源,例如網站、Web 服務等。用於 HTTP 的 URI 的通用語法如下

URI = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]

如果為空或未給出,則 HTTP 假設為埠 80,而空的abs_path等效於"/"的abs_path。除保留不安全集中的字元外,其他字元與其""%" HEX HEX"編碼等效。

示例

以下兩個 URI 等效

http://abc.com:80/~smith/home.html
http://ABC.com/%7Esmith/home.html
http://ABC.com:/%7esmith/home.html

日期/時間格式

所有 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

字元集

您可以使用字元集來指定客戶端首選的字元集。多個字元集可以用逗號分隔列出。如果未指定值,則預設為 US-ASCII。

示例

以下是有效的字元集

US-ASCII

or

ISO-8859-1

or 

ISO-8859-7

內容編碼

內容編碼值表示在透過網路傳遞之前已使用編碼演算法對內容進行了編碼。內容編碼主要用於允許壓縮文件或以其他有用的方式進行轉換,而不會丟失標識。

所有內容編碼值都不區分大小寫。HTTP/1.1 在我們將在後續章節中看到的 Accept-Encoding 和 Content-Encoding 報頭欄位中使用內容編碼值。

示例

以下是有效的編碼方案

Accept-encoding: gzip

or

Accept-encoding: compress

or 

Accept-encoding: deflate

媒體型別

HTTP 在Content-TypeAccept報頭欄位中使用 Internet 媒體型別,以提供開放且可擴充套件的資料型別和型別協商。所有媒體型別值都在網際網路號碼分配機構 (IANA) 註冊。以下是指定媒體型別的通用語法

media-type     = type "/" subtype *( ";" parameter )

型別、子型別和引數屬性名稱不區分大小寫。

示例

Accept: image/gif

語言標籤

HTTP 在Accept-LanguageContent-Language欄位中使用語言標籤。語言標籤由一個或多個部分組成:一個主語言標籤和一個可能為空的子標籤序列

language-tag  = primary-tag *( "-" subtag )

標籤內不允許使用空格,所有標籤都不區分大小寫。

示例

示例標籤包括

 en, en-US, en-cockney, i-cherokee, x-pig-latin

其中任何兩個字母的主標籤都是 ISO-639 語言縮寫,任何兩個字母的初始子標籤都是 ISO-3166 國家程式碼。

HTTP - 訊息

HTTP 基於客戶端-伺服器架構模型和無狀態請求/響應協議,該協議透過在可靠的 TCP/IP 連線上交換訊息來執行。

HTTP“客戶端”是一個程式(Web 瀏覽器或任何其他客戶端),它建立與伺服器的連線,目的是傳送一個或多個 HTTP 請求訊息。HTTP“伺服器”是一個程式(通常是 Web 伺服器,如 Apache Web 伺服器或 Internet Information Services IIS 等),它接受連線以透過傳送 HTTP 響應訊息來服務 HTTP 請求。

HTTP 利用統一資源識別符號 (URI) 來識別給定的資源並建立連線。一旦連線建立,HTTP 訊息就會以類似於網際網路郵件 [RFC5322] 和多用途網際網路郵件擴充套件 (MIME) [RFC2045] 使用的格式傳遞。這些訊息由客戶端到伺服器的請求和伺服器到客戶端的響應組成,其格式如下

 HTTP-message   = <Request> | <Response> ; HTTP/1.1 messages

HTTP 請求和 HTTP 響應使用 RFC 822 的通用訊息格式來傳輸所需的資料。此通用訊息格式包含以下四個專案。

  • A Start-line
  • Zero or more header fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body

以下部分將解釋 HTTP 訊息中使用的每個實體。

訊息起始行

起始行將具有以下通用語法

start-line = Request-Line | Status-Line

在分別討論 HTTP 請求和 HTTP 響應訊息時,我們將討論請求行和狀態行。現在讓我們看看請求和響應情況下起始行的示例

GET /hello.htm HTTP/1.1     (This is Request-Line sent by the client)

HTTP/1.1 200 OK             (This is Status-Line sent by the server)

報頭欄位

HTTP 報頭欄位提供有關請求或響應,或有關在訊息正文中傳送的物件的必要資訊。HTTP 訊息報頭有以下四種類型

  • 通用報頭:這些報頭欄位普遍適用於請求和響應訊息。

  • 請求報頭:這些報頭欄位僅適用於請求訊息。

  • 響應報頭:這些報頭欄位僅適用於響應訊息。

  • 實體報頭:這些報頭欄位定義有關實體正文的元資訊,或者如果不存在正文。

所有上述報頭都遵循相同的通用格式,每個報頭欄位都由一個名稱後跟一個冒號 (:) 和欄位值組成,如下所示

message-header = field-name ":" [ field-value ]

以下是各種報頭欄位的示例

User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3
Host: www.example.com
Accept-Language: en, mi
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Accept-Ranges: bytes
Content-Length: 51
Vary: Accept-Encoding
Content-Type: text/plain

訊息正文

訊息正文部分對於 HTTP 訊息是可選的,但如果可用,則用於攜帶與請求或響應關聯的實體正文。如果關聯了實體正文,則通常Content-TypeContent-Length報頭行指定關聯正文的性質。

訊息正文是攜帶實際 HTTP 請求資料(包括表單資料和上傳等)和伺服器的 HTTP 響應資料(包括檔案、影像等)的部分。以下是訊息正文的一個簡單內容

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

HTTP - 請求

HTTP 客戶端以請求訊息的形式向伺服器傳送 HTTP 請求,該請求訊息包括以下格式

  • A Request-line
  • Zero or more header (General|Request|Entity) fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body

以下部分將解釋 HTTP 訊息中使用的每個實體。

訊息請求行

請求行以方法標記開頭,後跟請求 URI 和協議版本,最後以 CRLF 結尾。元素之間用空格 SP 字元隔開。

Request-Line   = Method SP Request-URI SP HTTP-Version CRLF

讓我們討論請求行中提到的每個部分。

請求方法

請求方法指示要對由給定請求 URI標識的資源執行的方法。該方法區分大小寫,應始終以大寫形式提及。以下是 HTTP/1.1 中支援的方法

序號方法和描述
1GET
GET 方法用於使用給定的 URI 從給定的伺服器檢索資訊。使用 GET 的請求應該只檢索資料,並且不應對資料產生其他影響。
2HEAD
與 GET 相同,但僅傳輸狀態行和報頭部分。
3POST
POST 請求用於將資料傳送到伺服器,例如使用 HTML 表單的客戶資訊、檔案上傳等。
4PUT
用上傳的內容替換目標資源的所有當前表示。
5DELETE
刪除 URI 指定的目標資源的所有當前表示。
6CONNECT
建立到由給定 URI 標識的伺服器的隧道。
7OPTIONS
描述目標資源的通訊選項。
8TRACE
沿目標資源路徑執行訊息環回測試。

請求 URI

請求 URI 是一個統一資源識別符號,它標識要對其應用請求的資源。以下是指定 URI 的最常用形式

Request-URI = "*" | absoluteURI | abs_path | authority
序號方法和描述
1當 HTTP 請求不應用於特定資源,而是應用於伺服器本身時,使用星號*,並且僅當使用的方法不一定應用於資源時才允許使用。例如

OPTIONS * HTTP/1.1

2當向代理發出 HTTP 請求時,使用absoluteURI。請求代理轉發請求或從有效快取中提供服務,並返回響應。例如

GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

3Request-URI 最常見的形式是用於標識源伺服器或閘道器上的資源。例如,客戶端希望直接從源伺服器檢索上面的資源,它將建立一個到主機“www.w3.org”的 80 埠的 TCP 連線,併發送以下行:

GET /pub/WWW/TheProject.html HTTP/1.1
Host: www.w3.org

請注意,絕對路徑不能為空;如果原始 URI 中不存在任何路徑,則必須將其指定為“/”(伺服器根目錄)

請求報頭欄位

我們將在單獨的章節中學習通用報頭和實體報頭,屆時我們將學習 HTTP 報頭欄位。現在讓我們檢查一下請求報頭欄位是什麼。

請求報頭欄位允許客戶端向伺服器傳遞有關請求以及客戶端本身的附加資訊。這些欄位充當請求修飾符,並且可以使用以下重要的請求報頭欄位,具體取決於需求。

  • Accept-Charset

  • Accept-Encoding

  • Accept-Language

  • Authorization

  • Expect

  • From

  • Host

  • If-Match

  • If-Modified-Since

  • If-None-Match

  • If-Range

  • If-Unmodified-Since

  • Max-Forwards

  • Proxy-Authorization

  • Range

  • Referer

  • TE

  • User-Agent

如果您要編寫自己的自定義客戶端和 Web 伺服器,則可以引入自定義欄位。

請求訊息示例

現在讓我們將所有這些組合起來,形成一個 HTTP 請求,以從執行在 tutorialspoint.com 上的 Web 伺服器獲取hello.htm頁面。

GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

這裡我們沒有向伺服器傳送任何請求資料,因為我們是從伺服器獲取一個簡單的 HTML 頁面。Connection 是此處使用的通用報頭,其餘報頭是請求報頭。下面是另一個示例,我們使用請求訊息正文向伺服器傳送表單資料。

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: application/x-www-form-urlencoded
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

licenseID=string&content=string&/paramsXML=string

這裡給定的 URL /cgi-bin/process.cgi 將用於處理傳遞的資料,並相應地返回響應。這裡的content-type告訴伺服器傳遞的資料是簡單的 Web 表單資料,而length將是放入訊息正文的資料的實際長度。以下示例顯示如何將簡單的 XML 傳遞到您的 Web 伺服器。

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: length
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://clearforest.com/">string</string>

HTTP - 響應

伺服器在接收和解釋請求訊息後,將返回 HTTP 響應訊息。

  • A Status-line
  • Zero or more header (General|Response|Entity) fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body

以下部分將解釋 HTTP 訊息中使用的每個實體。

訊息狀態行

狀態行由協議版本、數字狀態程式碼及其關聯的文字短語組成。這些元素用空格 (SP) 字元分隔。

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

讓我們討論狀態行中提到的每個部分。

HTTP 版本

支援 HTTP 1.1 版本的伺服器將返回以下版本資訊:

HTTP-Version = HTTP/1.1

狀態碼

狀態碼元素是一個 3 位整數,其中狀態碼的第一位數字定義響應的類別,後兩位數字沒有任何分類作用。第一位數字有 5 個值。

序號程式碼和描述
11xx:資訊性
這意味著請求已接收並正在繼續處理。
22xx:成功
這意味著操作已成功接收、理解和接受。
33xx:重定向
這意味著必須採取進一步的操作才能完成請求。
44xx:客戶端錯誤
這意味著請求包含錯誤的語法或無法完成。
55xx:伺服器錯誤
伺服器未能完成明顯有效的請求。

HTTP 狀態程式碼是可擴充套件的,HTTP 應用程式不需要理解所有已註冊狀態程式碼的含義。所有狀態程式碼的列表已在單獨的章節中提供,供您參考。

響應報頭欄位

我們將在單獨的章節中學習通用報頭和實體報頭,屆時我們將學習 HTTP 報頭欄位。現在讓我們檢查一下響應報頭欄位是什麼。

響應報頭欄位允許伺服器傳遞有關響應的附加資訊,這些資訊無法放置在狀態行中。這些報頭欄位提供有關伺服器以及進一步訪問由 Request-URI 標識的資源的資訊。

  • Accept-Ranges

  • Age

  • ETag

  • Location

  • Proxy-Authenticate

  • Retry-After

  • 伺服器

  • Vary

  • WWW-Authenticate

如果您要編寫自己的自定義 Web 客戶端和伺服器,則可以引入自定義欄位。

響應訊息示例

現在讓我們將所有這些組合起來,形成一個 HTTP 響應,以響應從執行在 tutorialspoint.com 上的 Web 伺服器獲取hello.htm頁面的請求。

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

以下是一個 HTTP 響應訊息示例,顯示當 Web 伺服器找不到請求的頁面時的錯誤情況。

HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Connection: Closed
Content-Type: text/html; charset=iso-8859-1
   
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>404 Not Found</title>
</head>
<body>
   <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>

以下是一個 HTTP 響應訊息示例,顯示當 Web 伺服器在給定的 HTTP 請求中遇到錯誤的 HTTP 版本時的錯誤情況。

HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: Closed
   
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>400 Bad Request</title>
</head>
<body>
   <h1>Bad Request</h1>
   <p>Your browser sent a request that this server could not understand.<p>
   <p>The request line contained invalid characters following the protocol string.<p>
</body>
</html>

HTTP - 方法

HTTP/1.1 的常用方法集定義如下,並且可以根據需要擴充套件此方法集。這些方法名稱區分大小寫,必須使用大寫。

序號方法和描述
1GET
GET 方法用於使用給定的 URI 從給定的伺服器檢索資訊。使用 GET 的請求應該只檢索資料,並且不應對資料產生其他影響。
2HEAD
與 GET 相同,但僅傳輸狀態行和報頭部分。
3POST
POST 請求用於將資料傳送到伺服器,例如使用 HTML 表單的客戶資訊、檔案上傳等。
4PUT
用上傳的內容替換目標資源的所有當前表示。
5DELETE
刪除 URI 指定的目標資源的所有當前表示。
6CONNECT
建立到由給定 URI 標識的伺服器的隧道。
7OPTIONS
描述目標資源的通訊選項。
8TRACE
沿目標資源路徑執行訊息環回測試。

GET 方法

GET 請求透過在請求的 URL 部分中指定引數來從 Web 伺服器檢索資料。這是用於文件檢索的主要方法。以下是一個簡單的示例,它使用 GET 方法來獲取 hello.htm。

GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

伺服器對上述 GET 請求的響應如下:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

HEAD 方法

HEAD 方法在功能上類似於 GET,只是伺服器回覆響應行和報頭,但沒有實體正文。以下是一個簡單的示例,它使用 HEAD 方法來獲取有關 hello.htm 的報頭資訊。

HEAD /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

伺服器對上述 GET 請求的響應如下:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

您可以注意到,此處伺服器在報頭之後沒有傳送任何資料。

POST 方法

當您想要向伺服器傳送一些資料時,例如檔案更新、表單資料等,可以使用 POST 方法。以下是一個簡單的示例,它使用 POST 方法向伺服器傳送表單資料,該資料將由 process.cgi 處理,最後返回響應。

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: 88
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://clearforest.com/">string</string>

伺服器端指令碼 process.cgi 處理傳遞的資料併發送以下響應:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
ETag: "34aa387-d-1568eb00"
Vary: Authorization,Accept
Accept-Ranges: bytes
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Request Processed Successfully</h1>
</body>
</html>

PUT 方法

PUT 方法用於請求伺服器將包含的實體正文儲存在給定 URL 指定的位置。以下示例請求伺服器將給定的實體正文儲存在伺服器根目錄下的hello.htm中。

PUT /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Connection: Keep-Alive
Content-type: text/html
Content-Length: 182

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

伺服器將給定的實體正文儲存在hello.htm檔案中,並將以下響應傳送回客戶端。

HTTP/1.1 201 Created
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-type: text/html
Content-length: 30
Connection: Closed

<html>
<body>
<h1>The file was created.</h1>
</body>
</html>

DELETE 方法

DELETE 方法用於請求伺服器刪除給定 URL 指定位置的檔案。以下示例請求伺服器刪除伺服器根目錄下的給定檔案hello.htm

DELETE /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Connection: Keep-Alive

伺服器將刪除提到的檔案hello.htm,並將以下響應傳送回客戶端。

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-type: text/html
Content-length: 30
Connection: Closed

<html>
<body>
<h1>URL deleted.</h1>
</body>
</html>

CONNECT 方法

客戶端使用 CONNECT 方法透過 HTTP 建立與 Web 伺服器的網路連線。以下示例請求與執行在主機 tutorialspoint.com 上的 Web 伺服器建立連線。

CONNECT www.tutorialspoint.com HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

與伺服器建立連線,並將以下響應傳送回客戶端。

HTTP/1.1 200 Connection established
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)

OPTIONS 方法

客戶端使用 OPTIONS 方法來找出 Web 伺服器支援哪些 HTTP 方法和其他選項。客戶端可以為 OPTIONS 方法指定一個 URL,或者指定一個星號 (*) 來指代整個伺服器。以下示例請求執行在 tutorialspoint.com 上的 Web 伺服器支援的方法列表。

OPTIONS * HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

伺服器將根據伺服器的當前配置傳送資訊,例如:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Allow: GET,HEAD,POST,OPTIONS,TRACE
Content-Type: httpd/unix-directory

TRACE 方法

TRACE 方法用於將 HTTP 請求的內容回顯給請求者,這可以在開發時用於除錯目的。以下示例顯示了 TRACE 方法的用法。

TRACE / HTTP/1.1
Host: www.tutorialspoint.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

伺服器將傳送以下訊息作為對上述請求的響應:

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-Type: message/http
Content-Length: 39
Connection: Closed

TRACE / HTTP/1.1
Host: www.tutorialspoint.com
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)

HTTP - 狀態碼

伺服器響應中的狀態碼元素是一個 3 位整數,其中狀態碼的第一位數字定義響應的類別,後兩位數字沒有任何分類作用。第一位數字有 5 個值。

序號程式碼和描述
11xx:資訊性
這意味著請求已接收並正在繼續處理。
22xx:成功
這意味著操作已成功接收、理解和接受。
33xx:重定向
這意味著必須採取進一步的操作才能完成請求。
44xx:客戶端錯誤
這意味著請求包含錯誤的語法或無法完成。
55xx:伺服器錯誤
伺服器未能完成明顯有效的請求。

HTTP 狀態程式碼是可擴充套件的,HTTP 應用程式不需要理解所有已註冊狀態程式碼的含義。以下是所有狀態程式碼的列表。

1xx:資訊性

訊息 描述
100 Continue 伺服器只接收了請求的一部分,但只要它沒有被拒絕,客戶端就應該繼續請求。
101 Switching Protocols 伺服器切換協議。

2xx:成功

訊息 描述
200 OK 請求成功。
201 Created 請求已完成,並建立了一個新的資源。
202 Accepted 請求已被接受以進行處理,但處理尚未完成。
203 Non-authoritative Information 實體報頭中的資訊來自本地副本或第三方副本,而不是來自原始伺服器。
204 No Content 響應中給出了狀態程式碼和報頭,但回覆中沒有實體正文。
205 Reset Content 瀏覽器應清除用於此事務的表單以進行額外輸入。
206 Partial Content 伺服器正在返回請求大小的部分資料。用於響應指定Range報頭的請求。伺服器必須使用Content-Range報頭指定響應中包含的範圍。

3xx:重定向

訊息 描述
300 Multiple Choices 連結列表。使用者可以選擇一個連結並轉到該位置。最多五個地址。
301 Moved Permanently 請求的頁面已永久移動到新的 URL。
302 Found 請求的頁面已臨時移動到新的 URL。
303 See Other 請求的頁面可以在不同的 URL 下找到。
304 Not Modified 這是對If-Modified-SinceIf-None-Match報頭的響應程式碼,其中 URL 自指定日期以來未被修改。
305 Use Proxy 必須透過Location報頭中提到的代理訪問請求的 URL。
306 Unused 此程式碼在早期版本中使用過。它不再使用,但程式碼已保留。
307 Temporary Redirect 請求的頁面已臨時移動到新的 URL。

4xx:客戶端錯誤

訊息 描述
400 Bad Request 伺服器不理解請求。
401 Unauthorized 請求的頁面需要使用者名稱和密碼。
402 Payment Required 您尚不能使用此程式碼。
403 Forbidden 禁止訪問請求的頁面。
404 Not Found 伺服器找不到請求的頁面。
405 Method Not Allowed 請求中指定的方法不允許。
406 Not Acceptable 伺服器只能生成客戶端不接受的響應。
407 Proxy Authentication Required 此請求需要您先透過代理伺服器進行身份驗證。
408 請求超時 請求時間超過伺服器允許的等待時間。
409 衝突 由於衝突,請求無法完成。
410 已消失 請求的頁面已不可用。
411 需要長度 未定義“Content-Length”。伺服器在沒有此欄位的情況下將不接受請求。
412 預期失敗 伺服器評估請求中給定的前提條件為假。
413 請求實體過大 由於請求實體過大,伺服器將不接受請求。
414 請求 URL 過長 由於 URL 過長,伺服器將不接受請求。當您將長查詢資訊的“post”請求轉換為“get”請求時會發生這種情況。
415 不支援的媒體型別 由於不支援媒體型別,伺服器將不接受請求。
416 請求的範圍無法滿足 請求的位元組範圍不可用且超出範圍。
417 期望失敗 此伺服器無法滿足 Expect 請求頭欄位中給出的期望。

5xx:伺服器錯誤

訊息 描述
500 內部伺服器錯誤 請求未完成。伺服器遇到意外情況。
501 未實現 請求未完成。伺服器不支援所需的功能。
502 錯誤閘道器 請求未完成。伺服器從上游伺服器收到無效響應。
503 服務不可用 請求未完成。伺服器暫時過載或宕機。
504 閘道器超時 閘道器超時。
505 HTTP 版本不受支援 伺服器不支援此“HTTP 協議”版本。

HTTP - 報頭欄位

HTTP 報頭欄位提供有關請求或響應,或有關在訊息正文中傳送的物件的必要資訊。HTTP 訊息報頭有以下四種類型

  • 通用報頭:這些報頭欄位普遍適用於請求和響應訊息。

  • 客戶端請求頭:這些頭欄位僅適用於請求訊息。

  • 伺服器響應頭:這些頭欄位僅適用於響應訊息。

  • 實體報頭:這些報頭欄位定義有關實體正文的元資訊,或者如果不存在正文。

通用報頭

Cache-control

Cache-Control 通用報頭欄位用於指定所有快取系統都必須遵守的指令。以下是語法:

Cache-Control : cache-request-directive|cache-response-directive

HTTP 客戶端或伺服器可以使用Cache-control通用報頭來指定快取引數或請求快取中的某些型別的文件。快取指令以逗號分隔的列表形式指定。例如:

Cache-control: no-cache

以下是客戶端在其 HTTP 請求中可以使用的一些重要的快取請求指令:

序號快取請求指令及描述
1no-cache
快取不能使用此響應來滿足後續請求,除非與原始伺服器成功重新驗證。
2no-store
快取不應儲存有關客戶端請求或伺服器響應的任何資訊。
3max-age = 秒
指示客戶端願意接受年齡不超過指定秒數的響應。
4max-stale [ = 秒 ]
指示客戶端願意接受已超過其過期時間的響應。如果給出了秒數,則其過期時間不得超過該時間。
5min-fresh = 秒
指示客戶端願意接受其新鮮度生命週期不小於其當前年齡加上指定秒數的響應。
6no-transform
不要轉換實體主體。
7only-if-cached
不要檢索新資料。只有當文件在快取中時,快取才能傳送文件,並且不應聯絡原始伺服器檢視是否存在更新的副本。

以下是伺服器在其 HTTP 響應中可以使用的一些重要的快取響應指令:

序號快取請求指令及描述
1public
指示任何快取都可以快取響應。
2private
指示響應訊息的全部或部分內容僅供單個使用者使用,共享快取不得快取。
3no-cache
快取不能使用此響應來滿足後續請求,除非與原始伺服器成功重新驗證。
4no-store
快取不應儲存有關客戶端請求或伺服器響應的任何資訊。
5no-transform
不要轉換實體主體。
6must-revalidate
快取必須在使用過期文件之前驗證其狀態,並且不應使用已過期文件。
7proxy-revalidate
proxy-revalidate 指令和 must-revalidate 指令具有相同的含義,只是它不適用於非共享使用者代理快取。
8max-age = 秒
指示客戶端願意接受年齡不超過指定秒數的響應。
9s-maxage = 秒
此指令指定的最大年齡將覆蓋 max-age 指令或 Expires 頭指定的最大年齡。私有快取始終忽略 s-maxage 指令。

Connection

Connection 通用報頭欄位允許傳送方指定該特定連線所需的選項,並且代理不得透過進一步的連線來傳遞這些選項。以下是使用連線頭的簡單語法:

Connection : "Connection"

HTTP/1.1 定義了“closed”連線選項,以便傳送方發出訊號,指示在響應完成之後將關閉連線。例如:

Connection: Closed

預設情況下,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通用報頭來指示中間協議和接收者。例如,可以從代號為“fred”的內部代理(使用 HTTP/1.1 將請求轉發到 nowhere.com 的公共代理)向 HTTP/1.0 使用者代理傳送請求訊息,該公共代理透過將其轉發到 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 報頭。

Warning : warn-code SP warn-agent SP warn-text SP warn-date

客戶端請求頭

Accept

Accept 請求頭欄位可用於指定響應可接受的某些媒體型別。以下是通用語法:

Accept: type/subtype [q=qvalue]

多個媒體型別可以用逗號分隔列出,可選的 q 值表示接受型別的可接受質量級別,範圍為 0 到 1。以下是一個示例:

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]

多個字元集可以用逗號分隔列出,可選的 q 值表示非首選字元集的可接受質量級別,範圍為 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]

多個語言可以用逗號分隔列出,可選的 q 值表示非首選語言的可接受質量級別,範圍為 0 到 1。以下是一個示例:

Accept-Language: da, en-gb;q=0.8, en;q=0.7

Authorization

Authorization 請求頭欄位值包含憑據,其中包含使用者代理對請求資源領域的認證資訊。以下是通用語法:

Authorization : credentials

HTTP/1.0 規範定義了 BASIC 授權方案,其中授權引數是用 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 請求頭欄位包含控制請求使用者代理的人類使用者的網際網路電子郵件地址。以下是一個簡單的示例:

From: webmaster@w3.org

此報頭欄位可用於日誌記錄目的,以及識別無效或不需要的請求來源的方法。

Host

Host 請求頭欄位用於指定正在請求的資源的網際網路主機和埠號。以下是通用語法:

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(前提條件失敗)響應。

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(前提條件失敗)響應。

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]

位元組範圍規範中的 first-byte-pos 值給出範圍中第一個位元組的位元組偏移量。last-byte-pos 值給出範圍中最後一個位元組的位元組偏移量;也就是說,指定的位元組位置是包含的。您可以將位元組單位指定為 bytes 位元組偏移量從零開始。以下是一些簡單的示例

- 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.tutorialspoint.org/http/index.htm

如果欄位值是相對 URI,則應將其相對於Request-URI解釋。

TE

TE 請求頭欄位指示它願意在響應中接受什麼擴充套件傳輸編碼以及它是否願意在分塊傳輸編碼中接受尾部欄位。以下是通用語法

TE   : t-codings

關鍵字“trailers”的存在表示客戶端願意在分塊傳輸編碼中接受尾部欄位,並且可以透過以下兩種方式之一指定

TE: deflate
TE:
TE: trailers, deflate;q=0.5

如果 TE 欄位值為空,或者不存在 TE 欄位,則唯一的傳輸編碼是chunked。始終可以接受沒有傳輸編碼的訊息。

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 響應頭欄位用於將接收者重定向到請求 URI 以外的位置以完成操作。以下是通用語法

Location : absoluteURI

以下是一個簡單的示例

Location: http://www.tutorialspoint.org/http/index.htm

Content-Location 頭欄位與 Location 的區別在於,Content-Location 標識請求中包含的實體的原始位置。

Proxy-Authenticate

Proxy-Authenticate 響應頭欄位必須作為 407 (Proxy Authentication Required) 響應的一部分包含在內。以下是通用語法

Proxy-Authenticate  : challenge

Retry-After

Retry-After 響應頭欄位可以與 503 (Service Unavailable) 響應一起使用,以指示服務預計對請求客戶端不可用的時間長度。以下是通用語法

Retry-After : HTTP-date | delta-seconds

以下是兩個簡單的示例

Retry-After: Fri, 31 Dec 1999 23:59:59 GMT
Retry-After: 120

在後一個示例中,延遲為 2 分鐘。

伺服器

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 的逗號分隔列表。以下是可以指定為選項的可能值

序號選項和說明
1Comment=comment
此選項可用於指定與 Cookie 關聯的任何註釋。
2Domain=domain
Domain 屬性指定 Cookie 有效的域。
3Expires=Date-time
Cookie 將過期的日期。如果為空,則 Cookie 將在訪問者退出瀏覽器時過期
4Path=path
Path 屬性指定此 Cookie 應用於的 URL 子集。
5Secure
這指示使用者代理僅在安全連線下返回 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 (Unauthorized) 響應訊息中。欄位值包含至少一個挑戰,該挑戰指示適用於 Request-URI 的身份驗證方案和引數。以下是通用語法

WWW-Authenticate : challenge

WWW-Authenticate 欄位值,因為它可能包含多個挑戰,或者如果提供了多個 WWW-Authenticate 標頭欄位,則挑戰本身的內容可以包含逗號分隔的身份驗證引數列表。以下是一個簡單的示例

WWW-Authenticate: BASIC realm="Admin"

實體頭

Allow

Allow 實體頭欄位列出由 Request-URI 標識的資源支援的一組方法。以下是通用語法

Allow : Method

您可以用逗號分隔多個方法。以下是一個簡單的示例

Allow: GET, HEAD, PUT

此欄位無法阻止客戶端嘗試其他方法。

Content-Encoding

Content-Encoding 實體頭欄位用作媒體型別的修飾符。以下是通用語法

Content-Encoding : content-coding

內容編碼是 Request-URI 標識的實體的特徵。以下是一個簡單的示例

Content-Encoding: gzip

如果請求訊息中實體的內容編碼對於原始伺服器不可接受,則伺服器應以 415 (Unsupported Media Type) 的狀態程式碼進行響應。

Content-Language

Content-Language 實體頭欄位描述封閉實體的目標受眾的自然語言。以下是通用語法

Content-Language : language-tag

可以為面向多個受眾的內容列出多種語言。以下是一個簡單的示例

Content-Language: mi, en

Content-Language 的主要目的是允許使用者根據使用者自己的首選語言來識別和區分實體。

Content-Length

Content-Length 實體頭欄位指示傳送給接收者的實體正文的大小(以十進位制 OCTET 為單位),或者在 HEAD 方法的情況下,如果請求是 GET,則指示傳送的實體正文的大小。以下是通用語法

Content-Length : DIGITS

以下是一個簡單的示例

Content-Length: 3495

任何大於或等於零的 Content-Length 都是有效值。

Content-Location

Content-Location 實體頭欄位可用於在該實體可從請求資源的 URI 分開的位置訪問時,為訊息中包含的實體提供資源位置。以下是通用語法

Content-Location:  absoluteURI | relativeURI 

以下是一個簡單的示例

Content-Location: http://www.tutorialspoint.org/http/index.htm

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

假設實體總共包含 1234 個位元組,以下是位元組內容範圍規範值的示例

- The first 500 bytes:
Content-Range : bytes 0-499/1234

- The second 500 bytes:
Content-Range : bytes 500-999/1234

- All except for the first 500 bytes:
Content-Range : bytes 500-1233/1234

- The last 500 bytes:
Content-Range : bytes 734-1233/1234

當 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 - 快取

HTTP 通常用於分散式資訊系統,其中可以使用響應快取來提高效能。HTTP/1.1 協議包含許多旨在使快取工作的元素。

HTTP/1.1 中快取的目標是在許多情況下無需傳送請求,並在許多其他情況下無需傳送完整響應。

HTTP/1.1 中的基本快取機制是對快取的隱式指令,其中伺服器指定過期時間和驗證器。我們為此目的使用Cache-Control 標頭。

Cache-Control 標頭允許客戶端或伺服器在請求或響應中傳輸各種指令。這些指令通常會覆蓋預設的快取演算法。快取指令以逗號分隔的列表形式指定。例如:

Cache-control: no-cache

以下是客戶端在其 HTTP 請求中可以使用的一些重要的快取請求指令:

序號快取請求指令及描述
1no-cache
快取不能使用此響應來滿足後續請求,除非與原始伺服器成功重新驗證。
2no-store
快取不應儲存有關客戶端請求或伺服器響應的任何資訊。
3max-age = 秒
指示客戶端願意接受年齡不超過指定秒數的響應。
4max-stale [ = 秒 ]
指示客戶端願意接受已超過其過期時間的響應。如果給出了秒數,則其過期時間不得超過該時間。
5min-fresh = 秒
指示客戶端願意接受其新鮮度生命週期不小於其當前年齡加上指定秒數的響應。
6no-transform
不要轉換實體主體。
7only-if-cached
不要檢索新資料。只有當文件在快取中時,快取才能傳送文件,並且不應聯絡原始伺服器檢視是否存在更新的副本。

以下是伺服器在其 HTTP 響應中可以使用的一些重要的快取響應指令:

序號快取響應指令和說明
1public
指示任何快取都可以快取響應。
2private
指示響應訊息的全部或部分內容僅供單個使用者使用,共享快取不得快取。
3no-cache
快取不能使用此響應來滿足後續請求,除非與原始伺服器成功重新驗證。
4no-store
快取不應儲存有關客戶端請求或伺服器響應的任何資訊。
5no-transform
不要轉換實體主體。
6must-revalidate
快取必須在使用過期文件之前驗證其狀態,並且不應使用已過期文件。
7proxy-revalidate
proxy-revalidate 指令和 must-revalidate 指令具有相同的含義,只是它不適用於非共享使用者代理快取。
8max-age = 秒
指示客戶端願意接受年齡不超過指定秒數的響應。
9s-maxage = 秒
此指令指定的最大年齡將覆蓋 max-age 指令或 Expires 頭指定的最大年齡。私有快取始終忽略 s-maxage 指令。

HTTP - URL 編碼

HTTP URL 只能使用 ASCII 字元集透過網際網路傳送,這些字元集通常包含 ASCII 集之外的字元。因此,必須將這些不安全的字元替換為% 後跟兩位十六進位制數字。

下表顯示了字元的 ASCII 符號及其等效符號,最後是可以在傳遞到伺服器之前在 URL 中使用的替換。

ASCII符號替換
< 32 使用 %xx 編碼,其中 xx 是字元的十六進位制表示。
32空格+ 或 %20
33!%21
34"%22
35#%23
36$%24
37%%25
38&%26
39'%27
40(%28
41)%29
42**
43+%2B
44,%2C
45--
46..
47/%2F
4800
4911
5022
5133
5244
5355
5466
5577
5688
5799
58:%3A
59;%3B
60<%3C
61=%3D
62>%3E
63?%3F
64@%40
65AA
66BB
67CC
68DD
69EE
70FF
71GG
72HH
73II
74JJ
75KK
76LL
77MM
78NN
79OO
80PP
81QQ
82RR
83SS
84TT
85UU
86VV
87WW
88XX
89YY
90ZZ
91[%5B
92\%5C
93]%5D
94^%5E
95__
96`%60
97aa
98bb
99cc
100dd
101ee
102ff
103gg
104hh
105ii
106jj
107kk
108ll
109mm
110nn
111oo
112pp
113qq
114rr
115ss
116tt
117uu
118vv
119ww
120xx
121yy
122zz
123{%7B
124|%7C
125}%7D
126~%7E
127 %7F
> 127 使用 %xx 編碼,其中 xx 是字元的十六進位制表示。

HTTP - 安全性

HTTP 用於網際網路上的通訊,因此應用程式開發人員、資訊提供商和使用者應該瞭解 HTTP/1.1 中的安全限制。本討論不包含此處提及問題的最終解決方案,但它確實提出了一些減少安全風險的建議。

個人資訊洩露

HTTP 客戶端通常掌握大量個人資訊,例如使用者的姓名、位置、郵件地址、密碼、加密金鑰等。因此,您應該非常小心,避免透過 HTTP 協議無意中將這些資訊洩露給其他來源。

  • 所有機密資訊都應以加密形式儲存在伺服器端。

  • 透露伺服器的特定軟體版本可能會使伺服器機器更容易受到針對已知包含安全漏洞的軟體的攻擊。

  • 充當網路防火牆門戶的代理應特別注意傳輸標識防火牆後主機的標頭資訊。

  • 在“發件人”欄位中傳送的資訊可能會與使用者的隱私權益或其網站的安全策略衝突,因此不應在使用者能夠停用、啟用和修改欄位內容的情況下傳輸。

  • 如果引用頁面是使用安全協議傳輸的,則客戶端不應在(不安全)HTTP 請求中包含 Referer 標頭欄位。

  • 使用 HTTP 協議的服務作者不應使用基於 GET 的表單提交敏感資料,因為這會導致這些資料被編碼到 Request-URI 中。

基於檔案和路徑名的攻擊

文件應僅限於 HTTP 請求返回的文件,這些文件僅為伺服器管理員預期的文件。

例如,UNIX、Microsoft Windows 和其他作業系統使用.. 作為路徑元件來指示高於當前目錄的目錄級別。在這樣的系統上,如果 HTTP 伺服器否則允許訪問 HTTP 伺服器之外的資源,則 HTTP 伺服器必須禁止 Request-URI 中的任何此類構造。

DNS 欺騙

使用 HTTP 的客戶端嚴重依賴域名服務,因此通常容易受到基於故意錯誤關聯 IP 地址和 DNS 名稱的安全攻擊。因此,客戶端在假設 IP 號碼/DNS 名稱關聯的持續有效性時需要謹慎。

如果 HTTP 客戶端快取主機名查詢的結果以提高效能,則它們必須遵守 DNS 報告的 TTL 資訊。如果 HTTP 客戶端不遵守此規則,則當先前訪問的伺服器的 IP 地址更改時,它們可能會被欺騙。

位置標頭和欺騙

如果單個伺服器支援多個互不信任的組織,則它必須檢查在所述組織控制下生成的響應中的 Location 和 Content-Location 標頭的值,以確保它們不會嘗試使它們無權使用的資源無效。

身份驗證憑據

現有的 HTTP 客戶端和使用者代理通常無限期地保留身份驗證資訊。HTTP/1.1 沒有提供伺服器指示客戶端丟棄這些快取的憑據的方法,這是一個很大的安全風險。

有一些解決這個問題部分問題的變通方法,因此建議使用螢幕保護程式中的密碼保護、空閒超時和其他方法來減輕此問題固有的安全問題。

代理和快取

HTTP 代理是中間人,代表了中間人攻擊的機會。代理可以訪問安全相關資訊、有關個體使用者和組織的個人資訊以及屬於使用者和內容提供商的專有資訊。

代理運營商應像保護任何包含或傳輸敏感資訊的系統一樣保護執行代理的系統。

快取代理提供了額外的潛在漏洞,因為快取的內容代表了惡意利用的有吸引力的目標。因此,應將快取內容作為敏感資訊來保護。

HTTP - 訊息示例

示例 1

HTTP 請求從執行在 tutorialspoint.com 上的 Web 伺服器獲取hello.htm頁面

客戶端請求

GET /hello.htm HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

伺服器響應

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT
Content-Length: 88
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>

示例 2

HTTP 請求獲取執行在 tutorialspoint.com 上的 Web 伺服器上不存在的t.html頁面

客戶端請求

GET /t.html HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

伺服器響應

HTTP/1.1 404 Not Found
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: close
   
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>404 Not Found</title>
</head>
<body>
   <h1>Not Found</h1>
   <p>The requested URL /t.html was not found on this server.</p>
</body>
</html>

示例 3

HTTP 請求從執行在 tutorialspoint.com 上的 Web 伺服器獲取hello.htm頁面,但請求使用錯誤的 HTTP 版本

客戶端請求

GET /hello.htm HTTP1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

伺服器響應

HTTP/1.1 400 Bad Request
Date: Sun, 18 Oct 2012 10:36:20 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 230
Content-Type: text/html; charset=iso-8859-1
Connection: close
   
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html>
<head>
   <title>400 Bad Request</title>
</head>
<body>
   <h1>Bad Request</h1>
   <p>Your browser sent a request that this server could not understand.<p>
   <p>The request line contained invalid characters following the protocol string.<p>
</body>
</html>

示例 4

HTTP 請求將表單資料釋出到執行在 tutorialspoint.com 上的 Web 伺服器上的process.cgi CGI 頁面。伺服器在將它們設定為 Cookie 後返回傳遞的名稱

客戶端請求

POST /cgi-bin/process.cgi HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
Host: www.tutorialspoint.com
Content-Type: text/xml; charset=utf-8
Content-Length: 60
Accept-Language: en-us
Accept-Encoding: gzip, deflate
Connection: Keep-Alive

first=Zara&last=Ali

伺服器響應

HTTP/1.1 200 OK
Date: Mon, 27 Jul 2009 12:28:53 GMT
Server: Apache/2.2.14 (Win32)
Content-Length: 88
Set-Cookie: first=Zara,last=Ali;domain=tutorialspoint.com;Expires=Mon, 19-
Nov-2010 04:38:14 GMT;Path=/
Content-Type: text/html
Connection: Closed

<html>
<body>
<h1>Hello Zara Ali</h1>
</body>
</html>
廣告