-

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

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

基本功能

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

HTTP / 1.0对每个请求/响应交换使用新的连接,其中HTTP / 1.1连接可用于一个或多个请求/响应交换。

基础架构

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

HTTP架构

HTTP协议是基于客户机/服务器的架构的请求/响应协议,其中web浏览器,机器人和搜索引擎等像HTTP客户端,Web服务器作为服务器。

客户

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

服务器

HTTP服务器使用状态行进行响应,包括消息的协议版本和成功或错误代码,之后是包含服务器信息,实体元信息和可能的实体体内容的类似MIME的消息。

HTTP - 参数

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

HTTP版本

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

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

HTTP/1.0

or

HTTP/1.1

统一资源标识符(URI)

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

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

这里如果端口为空或未给定,端口80假定为HTTP,空的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: 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字段中的语言标签语言标签由1个或更多部分组成:主要语言标签和可能为空的一系列子标签:

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“服务器”是通过发送HTTP响应消息来接受连接以提供HTTP请求的程序(通常是Web服务器,如Apache Web Server或Internet Information Services IIS等)。

HTTP使用统一资源标识符(URI)来标识给定的资源并建立连接。一旦建立连接,HTTP消息将以类似于Internet邮件[RFC5322]和多用途Internet邮件扩展(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 deader字段提供有关请求或响应的所需信息,或关于在消息体中发送的对象。有以下四种类型的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消息中使用的每个实体。

消息请求行

请求行以方法令牌开头,后跟Request-URI和协议版本,并以CRLF结尾。元素由空格SP字符分隔。

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

让我们来探讨Request-Line中提到的每个部分。

请求方式

请求方法指示对由给定的Request-URI标识的资源执行的方法该方法区分大小写应始终以大写形式提及。以下是HTTP / 1.1中支持的方法

SN方法和说明
1GET
GET方法用于使用给定的URI从给定的服务器检索信息。使用GET的请求只能检索数据,对数据应该没有其他影响。
2HEAD
与GET相同,但只传输状态行和标题部分。
3POST POST
POST请求用于使用HTML表单将数据发送到服务器,例如客户信息,文件上传等。
4PUT
使用上传的内容替换目标资源的所有当前表示。
5DELETE
删除URI给出的目标资源的所有当前表示。
6CONNECT
建立到由给定URI标识的服务器的隧道。
7选项
描述目标资源的通信选项。
8TRACE
沿着目标资源的路径执行消息循环测试。

请求URI

Request-URI是统一资源标识符,并标识应用请求的资源。以下是最常用的指定URI的表单:

Request-URI = "*" | absoluteURI | abs_path | authority
SN方法和说明
1当HTTP请求不适用于特定资源但不适用于服务器本身时,使用星号*,并且仅当所使用的方法不一定适用于资源时才允许使用星号*例如:

选项* 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
主机:www.w3.org

请注意,绝对路径不能为空; 如果原始URI中不存在,则必须将其作为“/”(服务器根)

请求标头字段

当我们将学习HTTP头字段时,我们将在另一章中学习General-header和Entity-header。现在我们来看看请求头字段是什么。

请求头字段允许客户端将关于请求的附加信息以及关于客户端本身传递到服务器。这些字段充当请求修饰符,并且有以下重要的请求头字段可用,可以根据需要使用。

您可以引入自定义字段,以防您要编写自己的客户端和Web服务器。

请求消息示例

现在让我们一起来形成一个HTTP请求,从在vue5.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页面。连接是这里使用的通用头,其余的头是请求头。以下是使用请求消息正文将表单数据发送到服务器的另一个示例:

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表单数据,长度将是数据放在消息体中的实际长度。以下示例显示如何将计划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

让我们来探讨Status-Line中提到的每个部分。

HTTP版本

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

HTTP-Version = HTTP/1.1

状态码

状态代码元素是一个3位整数,其中状态代码的第一位数字定义了响应类别,最后两位数字没有任何分类角色。第一位数字有5个值:

SN代码和说明
11xx:信息
这意味着请求收到并继续进行。
22xx:成功
这意味着该操作已成功接收,理解并被接受。
33xx:重定向
这意味着为了完成请求,必须采取进一步措施。
44xx:客户端错误
这意味着请求包含错误的语法或无法实现
55xx:服务器错误
服务器无法完成明显有效的请求

HTTP状态代码是可扩展的,HTTP应用程序不需要了解所有注册状态代码的含义。所有状态代码的列表已在另一章中给出,供您参考。

响应头字段

当我们将学习HTTP头字段时,我们将在另一章中学习General-header和Entity-header。现在我们来看看Response头域是什么。

响应头字段允许服务器传递关于不能放置在状态行中的响应的附加信息。这些头字段提供有关服务器的信息,以及关于进一步访问由Request-URI标识的资源的信息。

您可以介绍您的自定义字段,以防您要编写自己的自定义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的常用方法,可以根据需要扩展该集合。这些方法名称区分大小写,并且必须以大写形式使用。

SN方法和说明
1GET
GET方法用于使用给定的URI从给定的服务器检索信息。使用GET的请求只能检索数据,对数据应该没有其他影响。
2HEAD
与GET相同,但只传输状态行和标题部分。
3POST POST
POST请求用于使用HTML表单将数据发送到服务器,例如客户信息,文件上传等。
4PUT
使用上传的内容替换目标资源的所有当前表示。
5DELETE
删除URI给出的目标资源的所有当前表示。
6CONNECT
建立到由给定URI标识的服务器的隧道。
7选项
描述目标资源的通信选项。
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方法用于请求服务器在给定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方法来查找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 - 状态码

服务器响应中的Status-Code元素是一个3位整数,其中Status-Code的第一位数字定义了响应类别,最后两位数字没有任何分类角色。第一位数字有5个值:

SN代码和说明
11xx:信息
这意味着请求收到并继续进行。
22xx:成功
这意味着该操作已成功接收,理解并被接受。
33xx:重定向
这意味着为了完成请求,必须采取进一步措施。
44xx:客户端错误
这意味着请求包含错误的语法或无法实现
55xx:服务器错误
服务器无法完成明显有效的请求

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

1xx:信息

信息: 描述:
100继续 只有部分请求已被服务器收到,但只要没有被拒绝,客户端应该继续请求
101交换协议 服务器切换协议

2xx:成功

信息: 描述:
200好 请求可以
201创建 请求完成,并创建一个新的资源 
202接受 该请求被接受处理,但处理不完整
203非权威信息 实体头中的信息来自本地或第三方副本,而不是原始服务器。
204无内容 响应中给出了状态代码和头,但答复中没有实体。
205重置内容 浏览器应清除用于此事务的表单以获取其他输入。
206部分内容 服务器正在返回所需大小的部分数据。用于响应指定Range的请求服务器必须使用Content-Range指定响应中包含的范围

3xx:重定向

信息: 描述:
300多项选择 链接列表。用户可以选择链接并转到该位置。最多五个地址  
301永久移动 请求的页面已经移动到新的URL 
302找到 请求的页面暂时移动到新的URL 
303见其他 请求的页面可以在不同的网址下找到 
304未修改 这是一个If-Modified-SinceIf-None-Match标头的响应代码,其中URL自指定的日期以来未被修改。
305使用代理 请求的URL必须通过位置标题中提到的代理访问
306 未使用 此代码在以前的版本中使用。它不再使用,但代码是保留的
307临时重定向 请求的页面暂时移动到新的URL

4xx:客户端错误

信息: 描述:
400错误请求 服务器不了解请求
401未经授权 请求的页面需要用户名和密码
402付款需要 您不能使用此代码
403禁止 访问被禁止到请求的页面
错误(404 服务器找不到请求的页面
405方法不允许 请求中指定的方法是不允许的
406不可接受 服务器只能生成不被客户端接受的响应
407代理验证需要 您可以在提供此请求之前,使用代理服务器进行身份验证
408请求超时 该请求比服务器准备等待的时间更长
409冲突 由于冲突,请求无法完成
410走了 请求的页面不再可用 
411需要长度 “Content-Length”未定义。服务器将不接受请求 
412前提条件失败 在请求中给出的前提条件由服务器评估为false
413请求实体太大 服务器将不接受该请求,因为请求实体太大
414请求URL过长 因为网址太长,服务器将不接受该请求。将“发布”请求转换为具有长查询信息的“获取”请求时发生 
415不支持的介质类型 因为不支持媒体类型,服务器将不接受该请求 
416请求范围不满意 请求的字节范围不可用,超出范围。
417期望失败 此服务器无法满足Expect请求头字段中给出的期望。

5xx:服务器错误

信息: 描述:
500内部服务器错误 请求未完成。服务器遇到意外状况
501未实施 请求未完成。服务器不支持所需的功能
502错误的网关 请求未完成。服务器收到来自上游服务器的无效响应
503服务不可用 请求未完成。服务器暂时超载或关闭
504网关超时 网关已经超时了
505 HTTP版本不受支持 服务器不支持“http协议”版本

HTTP - 标题字段

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

总干事

缓存控制

Cache-Control通用头字段用于指定所有缓存系统必须遵守的指令。以下是语法:

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

HTTP客户端或服务器可以使用缓存控制常规头来指定缓存的参数或从高速缓存中请求某些类型的文档。缓存指令以逗号分隔的列表指定。例如:

Cache-control: no-cache

以下重要的缓存请求指令可以由客户端在其HTTP请求中使用:

SN缓存请求指令和描述
1无缓存高速
缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。
2无存储
缓存不应存储有关客户端请求或服务器响应的任何内容。
3max-age = seconds
表示客户端愿意接受年龄不大于指定时间(秒)的响应。
4max-stale [= seconds]
表示客户端愿意接受超过其到期时间的响应。如果给出了秒数,则不能超过那段时间。
5min-fresh = seconds
表示客户端愿意接受其新鲜寿命不小于其当前时间加上指定时间(以秒为单位)的响应。
6无变换
不转换实体。
7only-if-cache
不检索新数据。缓存只有在缓存中才能发送文档,并且不应该联系源服务器以查看是否存在较新的副本。

以下重要缓存响应指令可由服务器在其HTTP响应中使用:

SN缓存请求指令和描述
1public
表示响应可能被任何缓存缓存。
2private
指示全部或部分响应消息是针对单个用户,不能由共享缓存缓存。
3无缓存高速
缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。
4无存储
缓存不应存储有关客户端请求或服务器响应的任何内容。
5无变换
不转换实体。
6must-revalidate
缓存必须在使用之前验证过时文档的状态,并且不能使用过期文档。
7proxy-revalidate
proxy-revalidate伪指令与must -revalidate伪指令的含义相同,不同之处在于它不适用于非共享用户代理缓存。
8max-age = seconds
表示客户端愿意接受年龄不大于指定时间(秒)的响应。
9s-maxage = seconds
此伪指令指定的最大年龄将覆盖由max-age伪指令或Expires头指定的最大值。s-maxage指令总是被私有缓存忽略。

连接

连接通用头字段允许发送方指定该特定连接所需的选项,并且不能由代理通过进一步的连接进行通信。以下是使用连接头的简单语法:

Connection : "Connection"

HTTP / 1.1定义了发送方的“已关闭”连接选项,表示响应完成后连接将关闭。例如:

Connection: Closed

默认情况下,HTTP 1.1使用持久连接,其中连接在事务之后不会自动关闭。另一方面,HTTP 1.0默认情况下不具有持久连接。如果1.0客户端希望使用持久连接,则会使用keep-alive参数,如下所示:

Connection: keep-alive

日期

所有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 : field-name

Trailer头域中列出的消息头字段不能包含以下头字段:

传输编码

传输编码通用头字段指示什么变换的类型已经被应用到所述消息体,以便将发送者和接收者之间安全地传递它。这与内容编码不同,因为传输编码是消息的属性,而不是实体。以下是Transfer-Encoding头字段的语法:

Transfer-Encoding: chunked

所有传输编码值都不区分大小写。

升级

升级常用头允许客户端指定它所支持的附加通信协议,并想如果服务器发现它适当的切换协议时使用。例如:

Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11

升级报头字段的目的是提供用于过渡的简单机制从HTTP / 1.1到一些其他的,不兼容的协议

通过

通过通用头必须由网关和代理被用于指示中间协议和收件人。例如,请求消息可以从HTTP / 1.0用户代理发送到代号为“fred”的内部代理,该代理使用HTTP / 1.1将请求转发到athere.com的公共代理,该代理完成请求将其转发到源服务器,网址为www.ics.uci.edu。www.ics.uci.edu收到的请求将具有以下Via头域:

Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)

升级报头字段的目的是提供用于过渡的简单机制从HTTP / 1.1到一些其他的,不兼容的协议

警告

警告通用头被用来携带这可能不是在该消息中被反射的消息的状态或转换的附加信息。响应可能携带多个警告标题。

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

客户端请求头

接受

接受请求头字段可以被用于指定其是用于响应上可接受的某些媒体类型。以下是一般的语法:

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 / html,而text / xc是首选的媒体类型,但如果它们不存在,则发送text / x-dvi实体,如果不存在,则发送text / plain实体。

接受字符集

接收字符集请求标头字段可以被用来指示什么字符集是用于响应是可接受的。以下是一般的语法:

Accept-Charset: character_set [q=qvalue]

多个字符集可以用逗号分隔,可选的qvalue表示非扩展字符集的可接受质量等级,取值范围为0到1.以下是一个示例:

Accept-Charset: iso-8859-5, unicode-1-1; q=0.8

特殊值“*”(如果存在于Accept-Charset字段中)匹配每个字符集,并且如果不存在Accept-Charset标题,则默认为任何字符集都是可接受的。

接受编码

接受编码请求标头字段类似于接受,但限制了内容编码是在响应是可接受的。以下是一般的语法:

Accept-Encoding: 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: language [q=qvalue]

可以列出多种语言,以逗号分隔,可选的qvalue以0到1的比例表示非优先语言的可接受质量水平。以下是一个示例:

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

授权

授权请求标头字段值由包含用户代理的针对资源的境界认证信息证书被请求。以下是一般的语法:

Authorization : credentials

HTTP / 1.0规范定义了BASIC授权方案,其中授权参数是用户名字符string在base 64中编码的密码。以下是一个示例:

Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM=

值解码为guest:guest123其中guest是用户ID,guest123是密码。

曲奇饼

cookie请求标头字段值中包含的名称/值对信息存储该URL。以下是一般的语法:

Cookie: name=value

可以使用分号指定多个Cookie,如下所示:

Cookie: name1=value1;name2=value2;name3=value3

期望

期望请求头字段被用于指示该特定服务器行为是由客户端所需。以下是一般的语法:

Expect : 100-continue | expectation-extension

如果服务器收到包含Expect字段的请求,该字段包含不支持的期望扩展名,则它必须以417(期望失败)状态进行响应。

请求头字段包含一个Internet电子邮件地址谁控制了请求的用户代理的人类用户。以下是一个简单的例子:

From: webmaster@w3.org

此标题字段可用于记录目的,并用作识别无效或不需要的请求的来源的手段。

主办

主机请求头字段用于指定所请求的资源的Internet主机和端口号。以下是一般的语法:

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

主机没有任何尾随端口信息意味着默认端口,这是80。例如,对于在源服务器上的请求http://www.w3.org/pub/WWW/将是:

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

如果匹配

如果-匹配请求头字段与方法中使用,使之条件。该标头只有在此标签中的给定值与由ETag表示的给定实体标签相匹配时,才会请求服务器执行请求的方法以下是一般的语法:

If-Match : entity-tag

星号(*)匹配任何实体,只有当实体存在时,事务才会继续。以下是可能的例子:

If-Match: "xyzzy"
If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-Match: *

如果没有实体标签匹配,或者如果给出“*”,并且当前实体不存在,则服务器不得执行请求的方法,并且必须返回412(前提条件失败)响应。

If-Modified-Since

的If-Modified-由于请求头字段用于与一个方法,使之条件。如果请求的URL自此字段中指定的时间以来未被修改,则不会从服务器返回实体; 相反,将返回304(未修改)的响应,而不需要任何消息体。以下是一般的语法:

If-Modified-Since : HTTP-date

该范围的一个例子是:

If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT

如果没有实体标签匹配,或者如果给出“*”,并且当前实体不存在,则服务器不得执行请求的方法,并且必须返回412(前提条件失败)响应。

如果无匹配

如果-无-匹配请求头字段与方法中使用,使之条件。只有当此标签中的一个给定值与由ETag表示的给定实体标签相匹配时,此头才会请求服务器执行请求的方法以下是一般的语法:

If-None-Match : entity-tag

星号(*)匹配任何实体,只有当实体不存在时,事务才会继续。以下是可能的例子:

If-None-Match: "xyzzy"
If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz"
If-None-Match: *

如果范围

如果-范围请求报头字段可以用一个条件GET可以使用,如果它已改变来请求缺失,如果它没有被改变的实体的唯一的部分,并且整个实体。以下是一般的语法:

If-Range : entity-tag | HTTP-date

实体标签或日期可以用于标识已经收到的部分实体。例如:

If-Range: Sat, 29 Oct 1994 19:43:31 GMT

这里如果从给定的日期起没有修改文档,服务器返回由Range头指定的字节范围,否则返回所有的新文档。

如果 - 未修改 - 自

如果未改性的-由于请求头字段与方法中使用,使之条件。以下是一般的语法:

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

最大-转发请求标头字段提供与TRACE和OPTIONS方法的机制,以限制代理或网关可以将该请求转发到下一个入站服务器的数量。以下是一般的语法:

Max-Forwards : n

Max-Forwards值是一个十进制整数,表示该请求消息可能转发的剩余次数。这对于使用TRACE方法进行调试非常有用,避免了无限循环。例如:

Max-Forwards : 5

对于HTTP规范中定义的所有其他方法,Max-Forwards头域可能会被忽略。

代理授权

代理授权请求头字段允许客户端本身(或其用户)识别与需要验证的代理。以下是一般的语法:

Proxy-Authorization : credentials

代理授权字段值由包含代理的用户代理和/或所请求的资源范围的认证信息的凭证组成。

范围

范围请求报头字段指定从文档请求的内容的部分范围(多个)。以下是一般的语法:

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请求头域允许客户端指定从该URL已被请求的资源的地址(URI)。以下是一般的语法:

Referer : absoluteURI | relativeURI

以下是一个简单的例子:

参考人:http://www.tutorialspoint.org/http/index.htm

如果字段值是相对URI,则应该相对于Request-URI进行解释

TE

TE请求头域指明了扩展传输编码,它愿意在响应和它是否愿意接受在分块拖车场接受传输编码以下是一般的语法:

TE   : t-codings

关键字“预告片”的存在表示客户端愿意接受分块传输编码中的预告片字段,并且以下列方式之一指定:

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

如果TE字段值为空,或者如果没有TE字段,则仅传输编码被分块没有转移编码的消息总是可以接受的。

用户代理

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

User-Agent : product | comment

例:

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

服务器响应头

接受范围

的Accept-范围响应头域允许服务器以指示其接受用于资源范围的请求。以下是一般的语法:

Accept-Ranges  : range-unit | none

例如,接受字节范围请求的服务器可能会发送

Accept-Ranges: bytes

不接受资源范围请求的服务器可能会发送:

Accept-Ranges: none

这将建议客户端不尝试范围请求。

年龄

年龄响应头字段传送由于响应(或其再验证)的时间量的发送者的估计在原点服务器生成。以下是一般的语法:

Age : delta-seconds

年龄值为非负十进制整数,表示时间(秒)。以下是一个简单的例子:

Age: 1030

包含缓存的HTTP / 1.1服务器必须在每个从其自己的缓存生成的响应中包含一个Age头域。

ETag

ETag的响应头域提供了所请求的变体的实体标签的当前值。以下是一般的语法:

ETag :  entity-tag

以下是简单的例子:

ETag: "xyzzy"
ETag: W/"xyzzy"
ETag: ""

位置

位置响应头字段用于收件人重定向到比Request-URI中完成其他的位置。以下是一般的语法:

Location : absoluteURI

以下是一个简单的例子:

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

Content-Location头域与Location的区别在于Content-Location标识了请求中包含的实体的原始位置。

代理验证

代理身份验证响应头域必须被包括作为407(代理身份验证必需的)响应的一部分。以下是一般的语法:

Proxy-Authenticate  : challenge

重试

重发后响应头域可以用503(服务不可用)响应被用于指示该服务被多久预计不可用给请求客户端。以下是一般的语法:

Retry-After : HTTP-date | delta-seconds

以下是两个简单的例子:

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

在后一个例子中,延迟是2分钟。

服务器

服务器响应头域包含关于所使用的原始服务器处理请求的软件信息。以下是一般的语法:

Server : product | comment

以下是一个简单的例子:

Server: Apache/2.2.14 (Win32)

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

Set-Cookie

的Set-Cookie响应头字段包含一个名称/值对信息保留此URL。以下是一般的语法:

Set-Cookie: NAME=VALUE; OPTIONS

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

SN选项和说明
1Comment = comment
此选项可用于指定与该cookie相关联的任何注释。
2Domain = domain
Domain属性指定cookie有效的域。
3Expires = Date-time
Cookie将过期的日期。如果这是空白的,cookie将在访问者退出浏览器时过期
4Path = path
Path属性指定此cookie应用于的URL的子集。
5security
指示用户代理仅在安全连接下返回cookie。

以下是由服务器生成的简单Cookie标头的示例:

Set-Cookie: name1=value1,name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT

变化

因人而异响应头字段指定该实体有多个源,并且因此可以根据请求报头(多个)的指定列表而变化。以下是一般的语法:

Vary : field-name

您可以指定由逗号分隔的多个标题,并且星号“*”的值指示未指定的参数不限于请求标头。以下是一个简单的例子:

Vary: Accept-Language, Accept-Encoding

这里的字段名称不区分大小写。

WWW认证

WWW身份验证响应头域必须包含在401(未授权)响应消息。字段值由至少一个指示认证方案的挑战和适用于Request-URI的参数组成。以下是一般的语法:

WWW-Authenticate : challenge

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

WWW-Authenticate: BASIC realm="Admin"

实体标题

允许

允许实体头域列出了一组由请求URI标识的资源支持的方法。以下是一般的语法:

Allow : Method

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

Allow: GET, HEAD, PUT

此字段无法阻止客户端尝试其他方法。

内容编码

内容编码实体头字段被用作改性剂的媒体类型。以下是一般的语法:

Content-Encoding : content-coding

内容编码是由Request-URI标识的实体的特征。以下是一个简单的例子:

Content-Encoding: gzip

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

内容语言

内容的语言实体头字段描述目标观众的封闭实体的自然语言(S)。以下是一般的语法:

Content-Language : language-tag

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

Content-Language: mi, en

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

内容长度

Content-Length的实体头字段指示实体主体的大小,以字节为单位的十进制数,发送到接收方,或在HEAD方法的情况下,这将被发送的实体主体的大小有该请求是GET。以下是一般的语法:

Content-Length : DIGITS

以下是一个简单的例子:

Content-Length: 3495

任何Content-Length大于或等于零是一个有效值。

内容位置

内容-位置实体头字段可以被使用时,该实体是从所请求的资源的URI单独可访问的位置以提供用于封闭该消息中的实体资源位置。以下是一般的语法:

Content-Location:  absoluteURI | relativeURI 

以下是一个简单的例子:

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

Content-Location的值也定义了实体的基本URI。

Content-MD5

内容-MD5实体头字段可以被用来提供实体的MD5摘要,用于检查该消息的在接收到的完整性。以下是一般的语法:

Content-MD5  : md5-digest using base64 of 128 bit MD5 digest as per RFC 1864

以下是一个简单的例子:

Content-MD5  : 8c2d46911f3f5a326455f0ed7a8ed3b3

MD5摘要基于实体的内容计算,包括已应用的任何内容编码,但不包括应用于消息体的任何传输编码。

内容范围

内容范围实体头域与部分实体主体发送到指定在全实体主体部分体应适用。以下是一般的语法:

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

内容类型

内容类型实体头字段指示媒体类型发送给接收方,或在HEAD方法的情况下,实体主体的,这将被发送的媒体类型有请求是一个GET。以下是一般的语法:

Content-Type : media-type

以下是一个例子:

Content-Type: text/html; charset=ISO-8859-4

到期

过期实体头字段给出的日期/时间之后,响应被视为失效。以下是一般的语法:

Expires : HTTP-date

以下是一个例子:

Expires: Thu, 01 Dec 1994 16:00:00 GMT

上一次更改

的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中的基本缓存机制是缓存的隐式指令,其中server指定到期时间和验证器。为此,我们使用Cache-Control头。

缓存控制头允许客户端或服务器发送各种请求或响应指令。这些指令通常会覆盖默认缓存算法。缓存指令以逗号分隔的列表指定。例如:

Cache-control: no-cache

以下重要的缓存请求指令可以由客户端在其HTTP请求中使用:

SN缓存请求指令和描述
1无缓存高速
缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。
2无存储
缓存不应存储有关客户端请求或服务器响应的任何内容。
3max-age = seconds
表示客户端愿意接受年龄不大于指定时间(秒)的响应。
4max-stale [= seconds]
表示客户端愿意接受超过其到期时间的响应。如果给出了秒数,则不能超过那段时间。
5min-fresh = seconds
表示客户端愿意接受其新鲜寿命不小于其当前时间加上指定时间(以秒为单位)的响应。
6无变换
不转换实体。
7only-if-cache
不检索新数据。缓存只有在缓存中才能发送文档,并且不应该联系源服务器以查看是否存在较新的副本。

以下重要缓存响应指令可由服务器在其HTTP响应中使用:

SN缓存请求指令和描述
1public
表示响应可能被任何缓存缓存。
2private
指示全部或部分响应消息是针对单个用户,不能由共享缓存缓存。
3无缓存高速
缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。
4无存储
缓存不应存储有关客户端请求或服务器响应的任何内容。
5无变换
不转换实体。
6must-revalidate
缓存必须在使用之前验证过时文档的状态,并且不能使用过期文档。
7proxy-revalidate
proxy-revalidate伪指令与must -revalidate伪指令的含义相同,不同之处在于它不适用于非共享用户代理缓存。
8max-age = seconds
表示客户端愿意接受年龄不大于指定时间(秒)的响应。
9s-maxage = seconds
此伪指令指定的最大年龄将覆盖由max-age伪指令或Expires头指定的最大值。s-maxage指令总是被私有缓存忽略。

HTTP - URL编码

HTTP URL只能使用ASCII字符(通常包含ASCII集合外的字符)通过Internet发送所以这些不安全的字符必须被替换为%,后跟两个十六进制数字。

下表显示了字符的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
65一个一个
66BB
67CC
68DD
69EE
70FF
71GG
72HH
73一世一世
74JJ
75KK
76LL
77MM
78NN
79OO
80PP
81
82RR
83SS
84TT
85uint16uint16
86VV
87WW
88XX
89YY
90ZZ
91[%5B
92%5C
93]%5D
94^%5E
95__
96`%60
97一个一个
98bb
99CC
100dd
101ee
102FF
103GG
104HH
105一世一世
106jj
107kk
108ll
109mm
110nn
111oo
112pp
113qq
114rr
115ss
116tt
117
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请求所返回的文档,仅作为服务器管理员打算的文档。

例如,UNIX,Microsoft Windows和其他操作系统使用..作为路径组件来指示当前级别的目录级别。在这样的系统上,HTTP服务器必须禁止在Request-URI中的任何这样的结构,否则允许访问那些希望通过HTTP服务器访问的资源。

DNS欺骗

使用HTTP的客户端在很大程度上依赖于域名服务,因此通常易于基于IP地址和DNS名称的故意错误关联的安全攻击。因此,客户端需要谨慎地考虑IP号码/ DNS名称关联的持续有效性。

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

位置标题和欺骗

如果单个服务器支持多个不相互信任的组织,那么它必须在所述组织的控制下生成的响应中检查位置和位置标题的值,以确保它们不会尝试使资源无效他们没有权威。

认证证书

现有的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请求发布表单数据process.cgi上运行的Web服务器上的CGI页面tutorialspoint.com服务器在将其设置为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>