Http 简明教程

HTTP - Quick Guide

超文本传输协议(HTTP)是一种用于分布式、协作式、超媒体信息系统的应用程序层协议。自1990年以来,它一直是万维网(即互联网)数据通信的基础。HTTP是一种通用的无状态协议,还可以通过扩展其请求方法、错误代码和标头来用于其他目的。

超文本传输协议(HTTP)是一种基于 TCP/IP 的通信协议,用于在万维网上传输数据(HTML 文件、图像文件、查询结果等)。默认端口是 TCP 80,但可以使用其他端口。它为计算机之间相互通信提供了一种标准化方式。HTTP 规范规定了客户端如何构建数据请求并将其发送到服务器,以及服务器如何响应这些请求。

Basic Features

以下三个基本功能使 HTTP 成为一个简单但功能强大的协议:

  1. HTTP 客户端即浏览器会发起 HTTP 请求,请求发出后,客户端与服务器断开连接并等待响应。服务器处理请求并重新建立与客户端的连接以发回响应。

  2. 这意味着,只要客户端和服务器都知道如何处理数据内容,就可以通过 HTTP 发送任何类型的数据。这要求客户端和服务器使用适当的 MIME 类型指定内容类型。

  3. 如上所述,HTTP是一种无连接协议,这是HTTP是一种无状态协议的直接结果。服务器和客户端只在当前请求期间知道彼此。之后,他们都会忘记对方。由于协议的这种特性,客户端和浏览器都无法保留网页之间的不同请求之间的信息。

Basic Architecture

下图显示了 web 应用程序的一个非常基本的架构,并描绘了 HTTP 所处的位置:

cgiarch

HTTP 协议是一种基于客户端/服务器架构的请求/响应协议,其中 web 浏览器、网络机器人和搜索引擎等充当 HTTP 客户端,而 Web 服务器充当服务器。

Client

HTTP 客户端以请求方法、URI 和协议版本的形式将请求发送到服务器,然后是包含请求修饰符、客户端信息和可能通过 TCP/IP 连接传递的主体内容的 MIME 类似消息。

Server

HTTP 服务器以状态行响应,其中包括消息的协议版本和成功或错误代码,然后是包含服务器信息、实体元信息和可能的实体正文内容的类似 MIME 的消息。

HTTP - Parameters

本章将列出一些重要的 HTTP 协议参数及其在通信中使用的语法。例如,日期格式、URL 格式等。在编写 HTTP 客户端或服务器程序时,这将帮助你构建请求和响应消息。在解释 HTTP 请求和响应的消息结构时,你将在后续章节中看到这些参数的完整用法。

HTTP Version

HTTP 使用编号方案来表示协议的版本。HTTP 消息的版本由第一行中的 HTTP 版本字段指示。以下是指定 HTTP 版本号的一般语法:

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

Example

HTTP/1.0

or

HTTP/1.1

Uniform Resource Identifiers (URI)

统一资源标识符 (URI) 是格式简单、不区分大小写的字符串,其中包含名称、位置等,用于标识资源,例如网站、web 服务等。用于 HTTP 的 URI 的一般语法如下:

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

如果 {} 中的内容为空或未给出,则假定 HTTP 端口为 80,而空 {} 等效于 “/”。{} 和 {} 集之外的字符等效于它们的 ""%" HEX HEX" 编码。

Example

以下两个 URI 是等效的:

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

Date/Time Formats

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

Character Sets

你使用字符集来指定客户端首选的字符集。多个字符集可以用逗号分隔。如果未指定值,则默认为 US-ASCII。

Example

以下是有效的字符集:

US-ASCII

or

ISO-8859-1

or

ISO-8859-7

Content Encodings

内容编码值表示在通过网络传递内容之前已使用编码算法来对内容进行编码。内容编码主要用于允许对文档进行压缩或以其他有用的方式转换,而不会丢失标识。

所有内容编码值都不区分大小写。HTTP/1.1 在 Accept-Encoding 和 Content-Encoding 头字段中使用内容编码值,我们将在后续章节中看到。

Example

以下是有效的编码方案:

Accept-encoding: gzip

or

Accept-encoding: compress

or

Accept-encoding: deflate

Media Types

HTTP 使用 Content-TypeAccept 标头字段中的互联网媒体类型,以提供开放且可扩展的数据类型和类型协商。所有媒体类型值都向互联网号码分配机构 (IANA) 注册。以下是指定媒体类型的通用语法:

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

类型、子类型和参数属性名称不区分大小写。

Example

Accept: image/gif

Language Tags

HTTP 在 Accept-LanguageContent-Language 字段中使用语言标签。语言标签由 1 个或多个部分组成:一个主要语言标签和一个可能为空子标签的系列:

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

标签内不允许有空格,所有标签不区分大小写。

Example

示例标签包括:

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

其中任何两个字母的主标签都是 ISO-639 语言缩写,任何两个字母的初始子标签都是 ISO-3166 国家代码。

HTTP - Messages

HTTP 基于客户端-服务器架构模型和一个无状态的请求/响应协议,该协议通过在可靠的 TCP/IP 连接上交换消息来操作。

HTTP “客户端”是为发送一个或多个 HTTP 请求消息的目的而建立到服务器的连接的程序(Web 浏览器或任何其他客户端)。HTTP “服务器”是一个程序(通常是 Web 服务器,如 Apache Web Server 或 Internet Information Services IIS 等),它接受连接以通过发送 HTTP 响应消息来处理 HTTP 请求。

HTTP 使用统一资源标识符 (URI) 来识别给定资源并建立连接。一旦建立连接, HTTP messages 将以类似于互联网邮件 [RFC5322] 和多用途互联网邮件扩展 (MIME) [RFC2045] 所用格式传递。这些消息由从客户端到服务器的 requests 和从服务器到客户端的 responses 组成,其将具有以下格式:

 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 消息中使用的每个实体。

Message Start-Line

启动行将具有以下通用语法:

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)

Header Fields

HTTP 标头字段提供有关请求或响应或消息正文中发送的对象的所需信息。有以下四种类型的 HTTP 消息标头:

  1. General-header: 这些标头字段适用于请求和响应消息。

  2. Request-header: 这些标头字段仅适用于请求消息。

  3. Response-header: 这些标头字段仅适用于响应消息。

  4. Entity-header: 这些标头字段定义实体正文的元信息,或者如果没有正文

所有上述标头都遵循相同的通用格式,每个标头字段都包含一个名称,后跟冒号 ( : ) 和字段值,如下所示:

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

Message Body

訊息主體部分對於 HTTP 訊息來說是可選的,但是如果可用,那麼就會用於傳遞與要求或回應相關的實體主體。如果實體主體相關,則通常 Content-Type 及 * Content-Length* 標頭行會指定與主體相關的性質。

訊息主體用於傳遞實際 HTTP 要求資料(包括表單資料、上傳資料等),以及由伺服器傳來的 HTTP 回應資料(包括檔案、影像等)。以下是訊息主體的簡單範例:

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

HTTP - Requests

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 消息中使用的每个实体。

Message Request-Line

请求行以方法标记开头,后跟请求 URI 和协议版本,并以 CRLF 结尾。各元素之间由空格 SP 字符分隔。

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

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

Request Method

要求 Method 指示所要對所給 Request-URI 識別的資源所執行的操作。該操作區分大小寫且應始終以大寫字母表示。以下為 HTTP/1.1 中支援的方法:

S.N.

Method and Description

1

GET GET 方法用於使用所給 URI 從指定的伺服器中擷取資訊。使用 GET 的要求只應擷取資料,且不可對資料產生任何其他影響。

2

HEAD 與 GET 相同,但只傳輸狀態行和標頭區段。

3

POST POST 要求用於傳送資料到伺服器,例如使用 HTML 表單的客戶端資訊、檔案上傳等。

4

PUT 將目前的目標資源的所有展示替換為所上傳的內容。

5

DELETE 移除由 URI 給定的目標資源的所有目前的展示。

6

CONNECT 建立對由所給 URI 識別的伺服器的通道。

7

OPTIONS 描述目標資源的通訊選項。

8

TRACE 執行訊息路徑回測來傳送目標資源。

Request-URI

Request-URI 是统一资源标识符,用于标识对其应用请求的资源。下面是最常用的 URI 指定形式:

Request-URI = "*" | absoluteURI | abs_path | authority

S.N.

Method and Description

1

星號 * 在 HTTP 要求不適用於特定資源,但適用於伺服器本身時使用,且僅在所使用的辦法不一定要適用於資源時允許使用。例如:OPTIONS * HTTP/1.1

2

absoluteURI 在向代理伺服器發出 HTTP 要求時使用。要求代理伺服器轉送要求或從有效快取中服務該要求,並傳回回應。例如:GET [role="bare"] [role="bare"]http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1

3

要求 URI 最常見的形式,是用於識別原始伺服器或閘道器上的資源。例如,如果客戶端想要直接從原始伺服器擷取上述資源,就會建立一個 TCP 連線到主機 "www.w3.org" 的埠 80,並傳送行:*GET /pub/WWW/TheProject.html HTTP/1.1 Host: www.w3.org*請注意,絕對路徑不能為空;倘若在原始 URI 中沒有載明任何絕對路徑,則一定會載明為 "/"(伺服器根目錄)

Request Header Fields

我們會在學習 HTTP 標頭欄位時,於獨立的一章節探討一般標頭和實體標頭。現在讓我們來看看什麼是要求標頭欄位。

要求標頭欄位讓客戶端得以在要求中,另外傳遞一些有關要求以及客戶端本身的資訊給伺服器。這些欄位的行為如同要求修改器,且有以下重要的可用要求標頭欄位,可用於依需求使用。

  1. Accept-Charset

  2. Accept-Encoding

  3. Accept-Language

  4. Authorization

  5. Expect

  6. From

  7. Host

  8. If-Match

  9. If-Modified-Since

  10. If-None-Match

  11. If-Range

  12. If-Unmodified-Since

  13. Max-Forwards

  14. Proxy-Authorization

  15. Range

  16. Referer

  17. TE

  18. User-Agent

如果你要撰寫自己的自訂客戶端和 Web 伺服器,可以採用自訂欄位。

Request Message Examples

现在让我们将它们放在一起,以便从在 tutorialspoint.com 上运行的 Web 服务器中提取 hello.htm 页面以形成一个 HTTP 请求

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

在这里,我们没有向服务器发送任何请求数据,因为我们正在从服务器中提取一个 plan HTML 页面。连接是此处使用的通用标头,其余标头是请求标头。以下是一个更多示例,其中使用请求消息正文将表单数据发送到服务器:

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 将是放入消息正文中的数据的实际长度。以下示例显示如何将 plan 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 - Responses

在收到并解读请求消息后,服务器会使用 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 消息中使用的每个实体。

Message Status-Line

状态行由协议版本后跟数字状态代码及其关联的文本短语组成。元素之间用空格 SP 字符分隔。

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

让我们讨论状态行中提到的每个部分。

HTTP Version

支持 HTTP 版本 1.1 的服务器将返回以下版本信息:

HTTP-Version = HTTP/1.1

Status Code

状态代码元素是 3 位整数,其中状态码的第一位定义了响应的类型,而最后两位没有分类作用。第一位有 5 个值:

S.N.

Code and Description

1

1xx: Informational 这意味着已收到请求并正在继续进行处理。

2

2xx: Success 这意味着已成功接收、理解和接受操作。

3

3xx: Redirection 这意味着必须采取进一步的措施才能完成请求。

4

4xx: Client Error 这意味着该请求包含语法错误或无法完成

5

5xx: Server Error 服务器无法完成一个明显有效的请求

HTTP 状态代码是可扩展的,并且不需要 HTTP 应用程序了解所有已注册状态代码的含义。列出了所有状态代码的清单,供你参考。

Response Header Fields

我们将在单独的章节中学习通用标头和实体标头,届时我们将学习 HTTP 标头字段。现在,我们来看看响应标头字段是什么。

响应标头字段允许服务器传递有关响应的附加信息,该信息无法放在状态行中。这些标头字段提供了有关服务器的信息,以及对请求 URI 所标识的资源的进一步访问。

  1. Accept-Ranges

  2. Age

  3. ETag

  4. Location

  5. Proxy-Authenticate

  6. Retry-After

  7. Server

  8. Vary

  9. WWW-Authenticate

如果你打算编写自己的自定义 Web 客户端和服务器,则可以引入自定义字段。

Response Message Examples

现在,让我们全部放在一起,为从在 tutorialspoint.com 上运行的 Web 服务器获取 hello.htm 页的请求形成一个 HTTP 响应

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 - Methods

下面定义了 HTTP/1.1 的常用方法集,并且可以根据要求扩展此方法集。这些方法名称区分大小写,并且必须使用大写字母。

S.N.

Method and Description

1

GET GET 方法用於使用所給 URI 從指定的伺服器中擷取資訊。使用 GET 的要求只應擷取資料,且不可對資料產生任何其他影響。

2

HEAD 與 GET 相同,但只傳輸狀態行和標頭區段。

3

POST POST 要求用於傳送資料到伺服器,例如使用 HTML 表單的客戶端資訊、檔案上傳等。

4

PUT 將目前的目標資源的所有展示替換為所上傳的內容。

5

DELETE 移除由 URI 給定的目標資源的所有目前的展示。

6

CONNECT 建立對由所給 URI 識別的伺服器的通道。

7

OPTIONS 描述目標資源的通訊選項。

8

TRACE 執行訊息路徑回測來傳送目標資源。

GET Method

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 Method

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 Method

当你想要向服务器发送某些数据(例如文件更新、表单数据等)时,请使用 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 Method

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 Method

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 Method

CONNECT 方法由客户端用于通过 HTTP 在网络中建立与网络服务器的连接。以下示例请求与运行在 tutorialspoint.com 主机上的网络服务器建立连接:

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 Method

OPTIONS 方法由客户端用于查找网络服务器支持的 HTTP 方法和其他选项。客户端可以为 OPTIONS 方法指定一个 URL,或一个星号 (*) 来引用整个服务器。以下示例请求 tutorialspoint.com 上运行的网络服务器支持的方法列表:

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 Method

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 - Status Codes

服务器响应中的状态代码元素是一个 3 位整数,状态代码的第一位定义了响应的类型,而后两位没有分类作用。第一位有 5 个值:

S.N.

Code and Description

1

1xx: Informational 这意味着已收到请求并正在继续进行处理。

2

2xx: Success 这意味着已成功接收、理解和接受操作。

3

3xx: Redirection 这意味着必须采取进一步的措施才能完成请求。

4

4xx: Client Error 这意味着该请求包含语法错误或无法完成

5

5xx: Server Error 服务器无法完成一个明显有效的请求

HTTP 状态代码是可以扩展的,而 HTTP 应用程序不需要理解所有已注册状态代码的含义。以下是所有状态代码的列表。

1xx: Information

Message:

Description:

100 Continue

服务器只收到了一部分请求,但只要它还没有被拒绝,客户端就应继续进行请求

101 Switching Protocols

The server switches protocol

2xx: Successful

Message:

Description:

200 OK

The request is OK

201 Created

该请求已完成,且已创建新的资源

202 Accepted

该请求已被接受处理,但处理尚未完成

203 Non-authoritative Information

实体标头中的信息来自本地或第三方副本,而不是源服务器。

204 No Content

响应中给出了一个状态代码和标头,但响应中没有实体内容。

205 Reset Content

浏览器应清除用于此事务的表单,以进行额外的输入。

206 Partial Content

服务器正在返回所请求的尺寸的部分数据。用作对指定 Range 标头的请求的响应。服务器必须使用 Content-Range 标头指定在响应中包含的范围。

3xx: Redirection

Message:

Description:

300 Multiple Choices

一个链接列表。用户可以选择一个链接并转到该位置。最多五个地址

301 Moved Permanently

请求的页面已移至新的 url

302 Found

该请求的页面已暂时移至新的 url

303 See Other

请求的页面可在不同的 url 下找到

304 Not Modified

这是对 If-Modified-Since 或 If-None-Match 标头的响应代码,其中 URL 自指定日期后未修改。

305 Use Proxy

请求的 URL 必须通过 Location 标头中提到的代理访问。

306 Unused

此代码用于以前的版本。它不再被使用,但代码被保留

307 Temporary Redirect

所请求的页面已暂时移动到一个新的 URL

4xx: Client Error

Message:

Description:

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 Request Timeout

该请求花费的时间超过服务器准备等待的时间。

409 Conflict

请求无法完成,因为发生了冲突。

410 Gone

请求的页面不再可用。

411 Length Required

未定义“内容长度”。没有它,服务器不会接受请求。

412 Precondition Failed

请求中给出的前提条件由服务器评估为 false。

413 请求实体太大。

服务器将不接受该请求,因为请求实体太大。

414 Request-url Too Long

服务器将不接受该请求,因为 URL 太长。当您将“post”请求转换为带有较长查询信息的“get”请求时,就会发生这种情况。

415 Unsupported Media Type

服务器将不接受请求,因为不支持媒体类型。

416 请求的范围无法满足。

请求的字节范围不可用且超出范围。

417 Expectation Failed

此服务器无法满足 Expect 请求头字段中给出的期望。

5xx: Server Error

Message:

Description:

500 Internal Server Error

未完成请求。服务器遇到意外情况。

501 Not Implemented

未完成请求。服务器不支持所需的功能。

502 Bad Gateway

未完成请求。服务器从上游服务器收到无效响应。

503 Service Unavailable

未完成请求。服务器暂时超载或宕机。

504 Gateway Timeout

网关超时。

不支持 505 HTTP 版本。

服务器不支持“http 协议”版本。

HTTP - Header Fields

HTTP 标头字段提供有关请求或响应或消息正文中发送的对象的所需信息。有以下四种类型的 HTTP 消息标头:

  1. General-header: 这些标头字段适用于请求和响应消息。

  2. Client Request-header: 这些首部字段只适用于请求消息。

  3. Server Response-header: 这些首部字段只适用于响应消息。

  4. Entity-header: 这些标头字段定义实体正文的元信息,或者如果没有正文

General Headers

Cache-control

cache-control 通用首部字段用于指定所有缓存系统必须遵循的指令。以下是语法:

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

HTTP 客户端或服务器可以使用 Cache-control 通用首部指定缓存参数或从缓存中请求某些类型的文档。缓存指令在一个逗号分隔的列表中指定。例如:

Cache-control: no-cache

以下是一些重要的缓存请求指令,客户端可以在 HTTP 请求中使用:

S.N.

缓存请求指令及说明

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 响应中使用以下重要缓存响应指令:

S.N.

缓存请求指令及说明

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 此指令所指定的 maximum age 将覆盖 max-age 指令或 Expires 头指定的 maximum age。私有缓存始终忽略 s-maxage 指令。

Connection

Connection general-header 域允许发送者指定对该特定连接所需选项,且代理不得通过进一步连接来通信该选项。以下是使用 connection 头的简单语法:

Connection : "Connection"

HTTP/1.1 为发送者定义了“closed”连接选项,以表明将在完成响应后关闭该连接。例如:

Connection: Closed

默认情况下,HTTP 1.1使用持久连接,其中连接不会在事务后自动关闭。另一方面,HTTP 1.0默认情况下没有持久连接。如果1.0客户端希望使用持久连接,它将使用`@ {s1}`参数,如下所示:

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 general-header 域用于包括可能适用于请求/响应链中任何接收者的实现特定指令。例如:

Pragma: no-cache

HTTP/1.0 中定义的唯一指令为 no-cache 指令,且为了向后兼容而维持在 HTTP 1.1 中。将来不会再定义新的 Pragma 指令。

Trailer

Trailer general 域值表明给定头域集存在于使用分块传输编码编码的消息预告中。以下是 Trailer 头域的语法:

Trailer : field-name

Trailer 头域中列出的消息头域不得包含以下头域:

  1. Transfer-Encoding

  2. Content-Length

  3. Trailer

Transfer-Encoding

Transfer-Encoding general-header 域表示已经针对消息体应用哪种类型的转换,以为便于在发送者和接收者之间安全传输该消息。这与 content-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 上的公共代理,该代理通过将请求转发到 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

Client Request Headers

Accept

Accept request-header 域可用于指定对响应而言可接受的特定媒体类型。以下是通用语法:

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/htmltext/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

特殊值 " ", if present in the *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 ,用 base64 编码。以下是一个示例:

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 请求头字段包含控制请求用户代理的人员的互联网电子邮件地址。以下是一个简单的示例:

From: webmaster@w3.org

此头字段可用于记录目的以及作为识别无效或不需要的请求的源的工具。

Host

Host 请求头字段用于指定所请求资源的互联网主机和端口号。以下是基本语法:

Host : "Host" ":" host [ ":" port ] ;

不带任何尾随端口信息的 host 表示默认端口 80。例如,[role="bare"] [role="bare"]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 值给出范围中最后一个字节的字节偏移量;也就是说,指定的字节位置是包含的。您可以将字节单位指定为字节 字节偏移量从零开始。以下是一些简单的示例:

- 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 字段,则唯一的传输编码是块传输编码。没有传输编码的消息始终是可接受的。

User-Agent

User-Agent 请求头字段包含有关发起请求的用户代理的信息。以下是一般语法:

User-Agent : product | comment

示例:

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

Server Response Headers

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

Content-Location 头字段与 Location 不同,因为 Content-Location 标识请求中包含的实体的原始位置。

Proxy-Authenticate

代理认证响应头字段必须作为 407(代理认证需要)响应的一部分包含在内。以下是通用语法:

Proxy-Authenticate  : challenge

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 : product | comment

以下是一个简单的示例:

Server: Apache/2.2.14 (Win32)

如果响应通过代理转发,代理应用程序不得修改服务器响应头。

设置 Cookie 响应头字段包含一个用于保留此 URL 的名称/值对。以下是通用语法:

Set-Cookie: NAME=VALUE; OPTIONS

设置 Cookie 响应头包含令牌 Set-Cookie:,后跟一个一个或多个 Cookie 的逗号分隔列表。以下是您可以指定为选项的可能值:

S.N.

Options and Description

1

此选项可用于指定与 Cookie 关联的任何注释。

2

域属性指定 Cookie 有效的域。

3

Cookie 过期的日期。如果为空白,Cookie 将在访问者退出浏览器时过期。

4

路径属性指定此 Cookie 适用的 URL 子集。

5

这指示用户代理仅在安全连接下返回 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(未授权)响应消息中。该字段值由至少一个挑战组成,该挑战指示适用于 Request-URI 的认证方案和参数。以下是通用语法:

WWW-Authenticate : challenge

WWW-Authenticate 字段值因为它可能包含多个挑战,或者提供了多个 WWW-Authenticate 头字段,所以挑战本身的内容可以包含一个认证参数逗号分隔列表。以下是一个简单的示例:

WWW-Authenticate: BASIC realm="Admin"

Entity Headers

Allow

Allow 实体首字段列出了由请求 URI 标识的资源支持的方法集。以下是其通用语法:

Allow : Method

你可以指定以逗号分隔的多方法。以下是一个简单的示例:

Allow: GET, HEAD, PUT

此字段不能防止客户端尝试其他方法。

Content-Encoding

Content-Encoding 实体首字段用作媒体类型的修饰符。以下是其通用语法:

Content-Encoding : content-coding

内容编码是请求 URI 标识的实体的一个特征。以下是一个简单的示例:

Content-Encoding: gzip

如果请求消息中实体的内容编码对原始服务器不可接受,则服务器应以 415(不支持的媒体类型)状态代码进行响应。

Content-Language

Content-Language 实体首字段描述了所附实体的预期受众的自然语言。以下是其通用语法:

Content-Language : language-tag

针对多个受众的内容可能会列出多种语言。以下是一个简单的示例:

Content-Language: mi, en

Content-Language 的主要目的是允许用户根据自己的首选语言识别和区分实体。

Content-Length

Content-Length 实体首字段指明发送给收件人的实体主体的大小,以十进制的八位字节数表示,或者对于 HEAD 方法而言,指明如果请求是 GET 发送的实体主体的大小。以下是其通用语法:

Content-Length : DIGITS

以下是一个简单的示例:

Content-Length: 3495

任何大于或等于零的内容长度都是一个有效值。

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 个字节,下面给出 byte-content-range-spec 值的示例:

- 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 - Caching

HTTP 通常用于分布式信息系统,其中可以通过使用响应缓存提高性能。HTTP/1.1 协议包含用于执行缓存工作的若干元素。

HTTP/1.1 中缓存的目标是消除在许多情况下发送请求的需求,并消除在许多其他情况下发送完整响应的需求。

HTTP/1.1 中基本的缓存机制是向缓存发出的隐式指令,其中服务器指定了过期时间和验证器。为此我们使用 Cache-Control 头。

Cache-Control 头允许客户端或服务器在请求或响应中传输各种指令。这些指令通常会覆盖默认缓存算法。缓存指令在一个逗号分隔列表中指定。例如:

Cache-control: no-cache

以下是一些重要的缓存请求指令,客户端可以在 HTTP 请求中使用:

S.N.

缓存请求指令及说明

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 响应中使用以下重要缓存响应指令:

S.N.

缓存响应指令及其说明

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 此指令所指定的 maximum age 将覆盖 max-age 指令或 Expires 头指定的 maximum age。私有缓存始终忽略 s-maxage 指令。

HTTP - URL Encoding

HTTP URL 只能使用 ASCII 字符集通过互联网发送,其中通常包含 ASCII 字符集之外的字符。因此,这些不安全的字符必须替换为 % 后接两个十六进制数字。

下表显示了字符的 ASCII 符号及其相等的符号,最后是可用于在将 URL 传递给服务器之前在 URL 中使用的替换:

ASCII

Symbol

Replacement

< 32

用 %xx 编码,其中 xx 是字符的十六进制表示。

32

space

+ or %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

48

0

0

49

1

1

50

2

2

51

3

3

52

4

4

53

5

5

54

6

6

55

7

7

56

8

8

57

9

9

58

:

%3A

59

;

%3B

60

<

%3C

61

=

%3D

62

>

%3E

63

?

%3F

64

@

%40

65

A

A

66

B

B

67

C

C

68

D

D

69

E

E

70

F

F

71

G

G

72

H

H

73

I

I

74

J

J

75

K

K

76

L

L

77

M

M

78

N

N

79

O

O

80

P

P

81

Q

Q

82

R

R

83

S

S

84

T

T

85

U

U

86

V

V

87

W

W

88

X

X

89

Y

Y

90

Z

Z

91

[

%5B

92

%5C

93

]

%5D

94

^

%5E

95

_

_

96

`

%60

97

a

a

98

b

b

99

c

c

100

d

d

101

e

e

102

f

f

103

g

g

104

h

h

105

i

i

106

j

j

107

k

k

108

l

l

109

m

m

110

n

n

111

o

o

112

p

p

113

q

q

114

r

r

115

s

s

116

t

t

117

u

u

118

v

v

119

w

w

120

x

x

121

y

y

122

z

z

123

{

%7B

124

%7C

125

}

%7D

126

~

%7E

127

%7F

> 127

HTTP - Security

HTTP用于互联网通信,因此应用程序开发人员、信息提供商和用户应当了解HTTP/1.1中的安全限制。本讨论不包括本文中所提问题的明确解决方案,但会提出一些减少安全风险的建议。

Personal Information leakage

HTTP客户端通常能够访问大量的个人信息,例如用户名、位置、邮件地址、密码、加密密钥等。因此,应十分小心,防止此类信息通过HTTP协议泄露给其他来源。

  1. 所有机密信息都应当以加密形式存储在服务器端。

  2. 透露服务器的特定软件版本可能会使服务器计算机更容易受到针对已知含有安全漏洞的软件发起的攻击。

  3. 充当网络防火墙门户的代理应采取特别预防措施,涉及识别防火墙后面主机的标头信息传输。

  4. “自”字段中发送的信息可能与用户的隐私利益或其网站安全策略相冲突,因此不应在未经用户禁用、启用和修改字段内容的情况下传输。

  5. 如果引用页面是通过安全协议传输的,则客户端不应在(非安全)HTTP请求中包含Referer标头字段。

  6. 使用HTTP协议的服务的作者不应使用基于GET的表单来提交敏感数据,因为这会导致这些数据被编码到请求URI中。

File and path names based attack

文档应限于HTTP请求返回的文档,仅限服务器管理员预期的那些文档。

例如,UNIX、Microsoft Windows和其他操作系统使用 .. 作为路径组件,以指示高于当前目录的目录级别。在这样的系统上,如果请求URI中包含这样的结构,且该结构将允许访问预期通过HTTP服务器访问的资源之外的资源,则HTTP服务器必须禁止在请求URI中包含这样的结构。

DNS Spoofing

使用HTTP的客户端严重依赖域名服务,因此通常容易受到基于IP地址和DNS名称故意错误关联的安全攻击。因此,客户端在假设IP编号/DNS名称关联的持续有效性时需要谨慎小心。

如果HTTP客户端缓存主机名查找结果以提高性能,则它们必须遵守DNS报告的TTL信息。如果HTTP客户端不遵守此规则,则在以前访问的服务器的IP地址发生更改时,它们可能会受到欺骗。

Location Headers and Spoofing

如果单一服务器支持多个彼此不信任的组织,那么它必须检查响应中生成在这些组织控制之下的Location和Content- Location标头值,以确保它们不会尝试使它们无权管理的资源无效。

Authentication Credentials

现有的HTTP客户端和用户代理通常无限期地保留认证信息。HTTP/1.1.不为服务器提供方法,指示客户端丢弃这些缓存的凭据,这是一个很大的安全风险。

本问题的部分内容有许多变通方法,因此建议在屏幕保护程序、闲置超时和其他方法(缓解此问题固有安全问题)中使用密码保护。

Proxies and Caching

HTTP代理是中间人,代表着中间人攻击机会。代理可以访问与安全性相关的信息、关于个人用户和组织的个人信息、以及属于用户和内容提供商的专有信息。

代理操作员应保护代理运行的系统,就像他们会保护包含或传输敏感信息的任何系统一样。

缓存代理提供了额外的潜在漏洞,因为缓存的内容代表恶意利用的有吸引力的目标。因此,缓存内容应作为敏感信息进行保护。

HTTP - Message Examples

Example 1

获取 hello.htm 页面的HTTP请求来自tutorialspoint.com上运行的Web服务器

Client request

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

Server response

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>

Example 2

用于获取在运行于 tutorialspoint.com 上的 Web 服务器上不存在的 t.html 页面的 HTTP 请求:

Client request

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

Server response

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>

Example 3

用于从运行于 tutorialspoint.com 上的 Web 服务器获取 hello.htm 页面的 HTTP 请求,但是该请求使用错误的 HTTP 版本:

Client request

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

Server response

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>

Example 4

用于向运行于 tutorialspoint.com 上的 Web 服务器上的 process.cgi CGI 页面提交表单数据的 HTTP 请求。服务器在将传入的名称设置为 Cookie 后返回它们:

Client request

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

Server response

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>