超文本传输协议(HTTP)是用于分布式,协作的超媒体信息系统的应用级协议。这是自1990年以来万维网(即互联网)的数据通信的基础。HTTP是一种通用和无状态的协议,可以用于其他目的,也可以使用其请求方法,错误代码和标题的扩展。
基本上,HTTP是一种基于TCP / IP的通信协议,用于在万维网上传递数据(HTML文件,图像文件,查询结果等)。默认端口为TCP 80,但可以使用其他端口。它提供了计算机相互通信的标准化方式。HTTP规范指定如何创建客户端请求数据并将其发送到服务器,以及服务器如何响应这些请求。
有以下三个基本功能使HTTP成为简单而强大的协议:
HTTP是无连接的: HTTP客户端ie。浏览器启动HTTP请求,并且在请求完成后,客户端从服务器断开连接并等待响应。服务器处理请求并重新建立与客户端的连接以发回响应。
HTTP是媒体独立的:这意味着只要客户端和服务器知道如何处理数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器需要使用适当的MIME类型来指定内容类型。
HTTP是无状态的:如上所述,HTTP是无连接的,这是HTTP是无状态协议的直接结果。服务器和客户端仅在当前请求期间才能彼此了解。之后,他们都忘了彼此。由于协议的这种性质,客户端和浏览器都不能在网页之间的不同请求之间保留信息。
HTTP / 1.0对每个请求/响应交换使用新的连接,其中HTTP / 1.1连接可用于一个或多个请求/响应交换。
下图显示了Web应用程序的非常基本的架构,并描绘了HTTP所在的位置:
HTTP协议是基于客户机/服务器的架构的请求/响应协议,其中web浏览器,机器人和搜索引擎等像HTTP客户端,Web服务器作为服务器。
HTTP客户端以请求方式,URI和协议版本的形式向服务器发送请求,其后是包含请求修饰符,客户端信息和通过TCP / IP连接的可能身体内容的类似MIME的消息。
HTTP服务器使用状态行进行响应,包括消息的协议版本和成功或错误代码,之后是包含服务器信息,实体元信息和可能的实体体内容的类似MIME的消息。
本章将介绍一些重要的HTTP协议参数及其语法在通信中的使用方式。例如,日期格式,URL格式等。这将帮助您在编写HTTP客户端或服务器程序时创建请求和响应消息。您将在后续章节中看到这些参数的完整用法,同时解释HTTP请求和响应的消息结构。
HTTP使用<major>。<minor>编号方案来指示协议的版本。HTTP消息的版本由第一行中的HTTP-Version字段指示。以下是指定HTTP版本号的一般语法:
HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
HTTP/1.0 or HTTP/1.1
统一资源标识符(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-Type和Accept头域中使用Internet媒体类型,以提供开放和可扩展的数据输入和类型协商。所有媒体类型的值都被注册到互联网分配号码管理机构((IANA)),以下是指定媒体类型的一般语法:
media-type = type "/" subtype *( ";" parameter )
类型,子类型和参数属性名称不区分大小写。
Accept: image/gif
HTTP使用Accept-Language和Content-Language字段中的语言标签。语言标签由1个或更多部分组成:主要语言标签和可能为空的一系列子标签:
language-tag = primary-tag *( "-" subtag )
标签内不允许使用空格,所有标签都不区分大小写。
示例代码包括:
en, en-US, en-cockney, i-cherokee, x-pig-latin
如果任何两个字母的主标签是ISO-639语言缩写,任何两个字母的初始子标签都是ISO-3166国家代码。
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的通用消息格式传输所需的数据。该通用消息格式由以下四个项目组成。
以下部分将介绍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消息头:
通用标题:这些标题字段对请求和响应消息都具有一般适用性。
请求报头:这些报头字段仅适用于请求消息。
Response-header:这些头字段仅适用于响应消息。
Entity-header:这些头字段定义了关于实体的元信息,如果没有body,
上面提到的所有报头遵循相同的通用格式和每个所述报头字段的包含名称后跟冒号的(:)和字段值,如下所示:
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-Type和Content-Length头部行指定与之关联的主体的性质。
消息体是携带实际的HTTP请求数据(包括表单数据和上传的信息)以及来自服务器的HTTP响应数据(包括文件,图像等)。以下是消息体的简单内容:
<html> <body> <h1>Hello, World!</h1> </body> </html>
HTTP客户端以请求消息的形式向服务器发送HTTP请求,其中包括以下格式:
以下部分将介绍HTTP消息中使用的每个实体。
请求行以方法令牌开头,后跟Request-URI和协议版本,并以CRLF结尾。元素由空格SP字符分隔。
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
让我们来探讨Request-Line中提到的每个部分。
请求方法指示对由给定的Request-URI标识的资源执行的方法。该方法区分大小写应始终以大写形式提及。以下是HTTP / 1.1中支持的方法
SN | 方法和说明 |
---|---|
1 | GET GET方法用于使用给定的URI从给定的服务器检索信息。使用GET的请求只能检索数据,对数据应该没有其他影响。 |
2 | HEAD 与GET相同,但只传输状态行和标题部分。 |
3 | POST POST POST请求用于使用HTML表单将数据发送到服务器,例如客户信息,文件上传等。 |
4 | PUT 使用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE 删除URI给出的目标资源的所有当前表示。 |
6 | CONNECT 建立到由给定URI标识的服务器的隧道。 |
7 | 选项 描述目标资源的通信选项。 |
8 | TRACE 沿着目标资源的路径执行消息循环测试。 |
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 |
3 | Request-URI的最常见形式是用于标识源服务器或网关上的资源。例如,希望从原始服务器直接检索资源的客户端将创建到主机“www.w3.org”的端口80的TCP连接,并发送行: GET /pub/WWW/TheProject.html HTTP / 1.1 请注意,绝对路径不能为空; 如果原始URI中不存在,则必须将其作为“/”(服务器根) |
当我们将学习HTTP头字段时,我们将在另一章中学习General-header和Entity-header。现在我们来看看请求头字段是什么。
请求头字段允许客户端将关于请求的附加信息以及关于客户端本身传递到服务器。这些字段充当请求修饰符,并且有以下重要的请求头字段可用,可以根据需要使用。
接受字符集
接受编码
接受语言
授权
期望
从
主办
如果匹配
If-Modified-Since
如果无匹配
如果范围
如果 - 未修改 - 自
Max-Forwards
代理授权
范围
参赞
TE
用户代理
您可以引入自定义字段,以防您要编写自己的客户端和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消息中使用的每个实体。
状态行由协议版本,后跟数字状态代码及其关联的文本短语组成。元素由空格SP字符分隔。
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
让我们来探讨Status-Line中提到的每个部分。
支持HTTP 1.1版本的服务器将返回以下版本信息:
HTTP-Version = HTTP/1.1
状态代码元素是一个3位整数,其中状态代码的第一位数字定义了响应类别,最后两位数字没有任何分类角色。第一位数字有5个值:
SN | 代码和说明 |
---|---|
1 | 1xx:信息 这意味着请求收到并继续进行。 |
2 | 2xx:成功 这意味着该操作已成功接收,理解并被接受。 |
3 | 3xx:重定向 这意味着为了完成请求,必须采取进一步措施。 |
4 | 4xx:客户端错误 这意味着请求包含错误的语法或无法实现 |
5 | 5xx:服务器错误 服务器无法完成明显有效的请求 |
HTTP状态代码是可扩展的,HTTP应用程序不需要了解所有注册状态代码的含义。所有状态代码的列表已在另一章中给出,供您参考。
当我们将学习HTTP头字段时,我们将在另一章中学习General-header和Entity-header。现在我们来看看Response头域是什么。
响应头字段允许服务器传递关于不能放置在状态行中的响应的附加信息。这些头字段提供有关服务器的信息,以及关于进一步访问由Request-URI标识的资源的信息。
接受范围
年龄
ETag
位置
代理验证
重试
服务器
变化
WWW认证
您可以介绍您的自定义字段,以防您要编写自己的自定义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 / 1.1的常用方法,可以根据需要扩展该集合。这些方法名称区分大小写,并且必须以大写形式使用。
SN | 方法和说明 |
---|---|
1 | GET GET方法用于使用给定的URI从给定的服务器检索信息。使用GET的请求只能检索数据,对数据应该没有其他影响。 |
2 | HEAD 与GET相同,但只传输状态行和标题部分。 |
3 | POST POST POST请求用于使用HTML表单将数据发送到服务器,例如客户信息,文件上传等。 |
4 | PUT 使用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE 删除URI给出的目标资源的所有当前表示。 |
6 | CONNECT 建立到由给定URI标识的服务器的隧道。 |
7 | 选项 描述目标资源的通信选项。 |
8 | TRACE 沿着目标资源的路径执行消息循环测试。 |
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方法在功能上类似于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方法将表单数据发送到服务器的简单示例,该服务器将由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方法用于请求服务器将包含的实体体存储在给定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方法通过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方法用于将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)
服务器响应中的Status-Code元素是一个3位整数,其中Status-Code的第一位数字定义了响应类别,最后两位数字没有任何分类角色。第一位数字有5个值:
SN | 代码和说明 |
---|---|
1 | 1xx:信息 这意味着请求收到并继续进行。 |
2 | 2xx:成功 这意味着该操作已成功接收,理解并被接受。 |
3 | 3xx:重定向 这意味着为了完成请求,必须采取进一步措施。 |
4 | 4xx:客户端错误 这意味着请求包含错误的语法或无法实现 |
5 | 5xx:服务器错误 服务器无法完成明显有效的请求 |
HTTP状态代码是可扩展的,HTTP应用程序不需要了解所有注册状态代码的含义。以下是所有状态代码的列表。
信息: | 描述: |
---|---|
100继续 | 只有部分请求已被服务器收到,但只要没有被拒绝,客户端应该继续请求 |
101交换协议 | 服务器切换协议 |
信息: | 描述: |
---|---|
200好 | 请求可以 |
201创建 | 请求完成,并创建一个新的资源 |
202接受 | 该请求被接受处理,但处理不完整 |
203非权威信息 | 实体头中的信息来自本地或第三方副本,而不是原始服务器。 |
204无内容 | 响应中给出了状态代码和头,但答复中没有实体。 |
205重置内容 | 浏览器应清除用于此事务的表单以获取其他输入。 |
206部分内容 | 服务器正在返回所需大小的部分数据。用于响应指定Range头的请求。服务器必须使用Content-Range头指定响应中包含的范围。 |
信息: | 描述: |
---|---|
300多项选择 | 链接列表。用户可以选择链接并转到该位置。最多五个地址 |
301永久移动 | 请求的页面已经移动到新的URL |
302找到 | 请求的页面暂时移动到新的URL |
303见其他 | 请求的页面可以在不同的网址下找到 |
304未修改 | 这是一个If-Modified-Since或If-None-Match标头的响应代码,其中URL自指定的日期以来未被修改。 |
305使用代理 | 请求的URL必须通过位置标题中提到的代理访问。 |
306 未使用 | 此代码在以前的版本中使用。它不再使用,但代码是保留的 |
307临时重定向 | 请求的页面暂时移动到新的URL |
信息: | 描述: |
---|---|
400错误请求 | 服务器不了解请求 |
401未经授权 | 请求的页面需要用户名和密码 |
402付款需要 | 您不能使用此代码 |
403禁止 | 访问被禁止到请求的页面 |
错误(404 | 服务器找不到请求的页面 |
405方法不允许 | 请求中指定的方法是不允许的 |
406不可接受 | 服务器只能生成不被客户端接受的响应 |
407代理验证需要 | 您可以在提供此请求之前,使用代理服务器进行身份验证 |
408请求超时 | 该请求比服务器准备等待的时间更长 |
409冲突 | 由于冲突,请求无法完成 |
410走了 | 请求的页面不再可用 |
411需要长度 | “Content-Length”未定义。服务器将不接受请求 |
412前提条件失败 | 在请求中给出的前提条件由服务器评估为false |
413请求实体太大 | 服务器将不接受该请求,因为请求实体太大 |
414请求URL过长 | 因为网址太长,服务器将不接受该请求。将“发布”请求转换为具有长查询信息的“获取”请求时发生 |
415不支持的介质类型 | 因为不支持媒体类型,服务器将不接受该请求 |
416请求范围不满意 | 请求的字节范围不可用,超出范围。 |
417期望失败 | 此服务器无法满足Expect请求头字段中给出的期望。 |
信息: | 描述: |
---|---|
500内部服务器错误 | 请求未完成。服务器遇到意外状况 |
501未实施 | 请求未完成。服务器不支持所需的功能 |
502错误的网关 | 请求未完成。服务器收到来自上游服务器的无效响应 |
503服务不可用 | 请求未完成。服务器暂时超载或关闭 |
504网关超时 | 网关已经超时了 |
505 HTTP版本不受支持 | 服务器不支持“http协议”版本 |
HTTP deader字段提供有关请求或响应的所需信息,或关于在消息体中发送的对象。有以下四种类型的HTTP消息头:
通用标题:这些标题字段对请求和响应消息都具有一般适用性。
客户端请求报头:这些报头字段仅适用于请求消息。
服务器响应头:这些头字段仅适用于响应消息。
Entity-header:这些头字段定义了关于实体的元信息,如果没有body,
Cache-Control通用头字段用于指定所有缓存系统必须遵守的指令。以下是语法:
Cache-Control : cache-request-directive|cache-response-directive
HTTP客户端或服务器可以使用缓存控制常规头来指定缓存的参数或从高速缓存中请求某些类型的文档。缓存指令以逗号分隔的列表指定。例如:
Cache-control: no-cache
以下重要的缓存请求指令可以由客户端在其HTTP请求中使用:
SN | 缓存请求指令和描述 |
---|---|
1 | 无缓存高速 缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。 |
2 | 无存储 缓存不应存储有关客户端请求或服务器响应的任何内容。 |
3 | max-age = seconds 表示客户端愿意接受年龄不大于指定时间(秒)的响应。 |
4 | max-stale [= seconds] 表示客户端愿意接受超过其到期时间的响应。如果给出了秒数,则不能超过那段时间。 |
5 | min-fresh = seconds 表示客户端愿意接受其新鲜寿命不小于其当前时间加上指定时间(以秒为单位)的响应。 |
6 | 无变换 不转换实体。 |
7 | only-if-cache 不检索新数据。缓存只有在缓存中才能发送文档,并且不应该联系源服务器以查看是否存在较新的副本。 |
以下重要缓存响应指令可由服务器在其HTTP响应中使用:
SN | 缓存请求指令和描述 |
---|---|
1 | public 表示响应可能被任何缓存缓存。 |
2 | private 指示全部或部分响应消息是针对单个用户,不能由共享缓存缓存。 |
3 | 无缓存高速 缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。 |
4 | 无存储 缓存不应存储有关客户端请求或服务器响应的任何内容。 |
5 | 无变换 不转换实体。 |
6 | must-revalidate 缓存必须在使用之前验证过时文档的状态,并且不能使用过期文档。 |
7 | proxy-revalidate proxy-revalidate伪指令与must -revalidate伪指令的含义相同,不同之处在于它不适用于非共享用户代理缓存。 |
8 | max-age = seconds 表示客户端愿意接受年龄不大于指定时间(秒)的响应。 |
9 | s-maxage = seconds 此伪指令指定的最大年龄将覆盖由max-age伪指令或Expires头指定的最大值。s-maxage指令总是被私有缓存忽略。 |
连接通用头字段允许发送方指定该特定连接所需的选项,并且不能由代理通过进一步的连接进行通信。以下是使用连接头的简单语法:
Connection : "Connection"
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: 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-由于请求头字段用于与一个方法,使之条件。如果请求的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头。
在最大-转发请求标头字段提供与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 : 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 : 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响应头字段包含一个名称/值对信息保留此URL。以下是一般的语法:
Set-Cookie: NAME=VALUE; OPTIONS
Set-Cookie响应头包括令牌Set-Cookie:,后跟一个或多个Cookie的逗号分隔列表。以下是您可以指定的可能值:
SN | 选项和说明 |
---|---|
1 | Comment = comment 此选项可用于指定与该cookie相关联的任何注释。 |
2 | Domain = domain Domain属性指定cookie有效的域。 |
3 | Expires = Date-time Cookie将过期的日期。如果这是空白的,cookie将在访问者退出浏览器时过期 |
4 | Path = path Path属性指定此cookie应用于的URL的子集。 |
5 | security 指示用户代理仅在安全连接下返回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身份验证响应头域必须包含在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。
内容-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 / 1.1协议包含许多旨在使缓存工作的元素。
在HTTP / 1.1中缓存的目标是在许多情况下消除发送请求的需要,并且在许多其他情况下不需要发送完整的响应。
HTTP / 1.1中的基本缓存机制是缓存的隐式指令,其中server指定到期时间和验证器。为此,我们使用Cache-Control头。
缓存控制头允许客户端或服务器发送各种请求或响应指令。这些指令通常会覆盖默认缓存算法。缓存指令以逗号分隔的列表指定。例如:
Cache-control: no-cache
以下重要的缓存请求指令可以由客户端在其HTTP请求中使用:
SN | 缓存请求指令和描述 |
---|---|
1 | 无缓存高速 缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。 |
2 | 无存储 缓存不应存储有关客户端请求或服务器响应的任何内容。 |
3 | max-age = seconds 表示客户端愿意接受年龄不大于指定时间(秒)的响应。 |
4 | max-stale [= seconds] 表示客户端愿意接受超过其到期时间的响应。如果给出了秒数,则不能超过那段时间。 |
5 | min-fresh = seconds 表示客户端愿意接受其新鲜寿命不小于其当前时间加上指定时间(以秒为单位)的响应。 |
6 | 无变换 不转换实体。 |
7 | only-if-cache 不检索新数据。缓存只有在缓存中才能发送文档,并且不应该联系源服务器以查看是否存在较新的副本。 |
以下重要缓存响应指令可由服务器在其HTTP响应中使用:
SN | 缓存请求指令和描述 |
---|---|
1 | public 表示响应可能被任何缓存缓存。 |
2 | private 指示全部或部分响应消息是针对单个用户,不能由共享缓存缓存。 |
3 | 无缓存高速 缓存不得使用响应来满足后续请求,而不会使用原始服务器重新生效。 |
4 | 无存储 缓存不应存储有关客户端请求或服务器响应的任何内容。 |
5 | 无变换 不转换实体。 |
6 | must-revalidate 缓存必须在使用之前验证过时文档的状态,并且不能使用过期文档。 |
7 | proxy-revalidate proxy-revalidate伪指令与must -revalidate伪指令的含义相同,不同之处在于它不适用于非共享用户代理缓存。 |
8 | max-age = seconds 表示客户端愿意接受年龄不大于指定时间(秒)的响应。 |
9 | s-maxage = seconds 此伪指令指定的最大年龄将覆盖由max-age伪指令或Expires头指定的最大值。s-maxage指令总是被私有缓存忽略。 |
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 |
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 | 一个 | 一个 |
66 | B | B |
67 | C | C |
68 | D | D |
69 | E | E |
70 | F | F |
71 | G | G |
72 | H | H |
73 | 一世 | 一世 |
74 | J | J |
75 | K | K |
76 | L | L |
77 | M | M |
78 | N | N |
79 | O | O |
80 | P | P |
81 | 问 | 问 |
82 | R | R |
83 | S | S |
84 | T | T |
85 | uint16 | uint16 |
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 | 一个 | 一个 |
98 | b | b |
99 | C | C |
100 | d | d |
101 | e | e |
102 | F | F |
103 | G | G |
104 | H | H |
105 | 一世 | 一世 |
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 | 你 | 你 |
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 | 用%xx编码,其中xx是字符的十六进制表示形式 |
HTTP用于通过互联网进行通信,因此应用程序开发人员,信息提供者和用户应该了解HTTP / 1.1中的安全限制。这个探讨不包括对这里提到的问题的明确的解决方案,但它提出了一些降低安全风险的建议。
HTTP客户端通常对大量个人信息(例如用户名,位置,邮箱地址,密码,加密密钥等)都是隐私的,所以您应该非常小心,以防止这些信息通过HTTP协议泄漏到其他来源。
所有机密信息应以加密形式存储在服务器端。
显示服务器的特定软件版本可能允许服务器机器更容易受到已知包含安全漏洞的软件的攻击。
通过网络防火墙作为门户网站的代理应该对传输标识防火墙后面的主机的头信息采取特殊的预防措施。
在“发件人”字段中发送的信息可能与用户的隐私权益或其网站的安全策略相冲突,因此,如果用户无法禁用,启用和修改该字段的内容,则不应传送该信息。
如果引用页面使用安全协议传输,客户端不应在(非安全)HTTP请求中包含引用头标题字段。
使用HTTP协议的服务的作者不应该使用基于GET的表单来提交敏感数据,因为这将导致该数据在Request-URI中被编码
该文档应限于HTTP请求所返回的文档,仅作为服务器管理员打算的文档。
例如,UNIX,Microsoft Windows和其他操作系统使用..作为路径组件来指示当前级别的目录级别。在这样的系统上,HTTP服务器必须禁止在Request-URI中的任何这样的结构,否则允许访问那些希望通过HTTP服务器访问的资源。
使用HTTP的客户端在很大程度上依赖于域名服务,因此通常易于基于IP地址和DNS名称的故意错误关联的安全攻击。因此,客户端需要谨慎地考虑IP号码/ DNS名称关联的持续有效性。
如果HTTP客户端缓存主机名查找结果以达到性能提升,则必须遵守DNS报告的TTL信息。如果HTTP客户端不遵守此规则,当以前访问的服务器的IP地址更改时,它们可能会被欺骗。
如果单个服务器支持多个不相互信任的组织,那么它必须在所述组织的控制下生成的响应中检查位置和位置标题的值,以确保它们不会尝试使资源无效他们没有权威。
现有的HTTP客户端和用户代理通常会无限期地保留认证信息。HTTP / 1.1。不提供服务器的方法来指导客户端丢弃这些高度安全风险的缓存凭据。
在这个问题的一部分,有一些工作环节,因此建议在屏幕保护程序,空闲超时和其他方法中使用密码保护,以减轻此问题中固有的安全问题。
HTTP代理是中间人,代表了中间人攻击的机会。代理可以访问安全相关信息,个人用户和组织的个人信息以及属于用户和内容提供商的专有信息。
代理运算符应保护代理运行的系统,因为它们将保护包含或传输敏感信息的任何系统。
缓存代理提供了额外的潜在漏洞,因为缓存的内容代表恶意攻击的有吸引力的目标。因此,缓存内容应该被保护为敏感信息。
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>
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>
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>
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>