- HTTP 教程
- HTTP - 首页
- HTTP - 概述
- HTTP - 参数
- HTTP - 消息
- HTTP - 请求
- HTTP - 响应
- HTTP - 方法
- HTTP - 状态码
- HTTP - 报头字段
- HTTP - 缓存
- HTTP - URL 编码
- HTTP - 安全性
- HTTP - 消息示例
- HTTP 有用资源
- HTTP 快速指南
- HTTP - 有用资源
HTTP 快速指南
超文本传输协议 (HTTP) 是一种用于分布式、协作式超媒体信息系统的应用层协议。自 1990 年以来,它是万维网(即互联网)数据通信的基础。HTTP 是一种通用且无状态的协议,也可以通过扩展其请求方法、错误代码和报头用于其他目的。
基本上,HTTP 是一种基于 TCP/IP 的通信协议,用于在万维网上交付数据(HTML 文件、图像文件、查询结果等)。默认端口为 TCP 80,但也可以使用其他端口。它为计算机之间以标准化方式进行通信提供了一种方法。HTTP 规范指定了客户端如何构建和发送数据请求到服务器,以及服务器如何响应这些请求。
基本特性
以下三个基本特性使 HTTP 成为一个简单而强大的协议
HTTP 是无连接的:HTTP 客户端(即浏览器)发起 HTTP 请求,请求发出后,客户端断开与服务器的连接并等待响应。服务器处理请求并重新与客户端建立连接以发送响应。
HTTP 是媒体无关的:这意味着,只要客户端和服务器都知道如何处理数据内容,任何类型的数据都可以通过 HTTP 发送。这需要客户端和服务器使用适当的 MIME 类型来指定内容类型。
HTTP 是无状态的:如上所述,HTTP 是无连接的,这是 HTTP 是一种无状态协议的直接结果。服务器和客户端仅在当前请求期间彼此了解。之后,两者都忘记了对方。由于协议的这种性质,客户端或浏览器都无法在不同网页的请求之间保留信息。
HTTP/1.0 每个请求/响应交换使用新的连接,而 HTTP/1.1 连接可用于一个或多个请求/响应交换。
基本架构
下图显示了一个 Web 应用程序的非常基本的架构,并描述了 HTTP 的位置
HTTP 协议是一种基于客户端/服务器架构的请求/响应协议,其中 Web 浏览器、机器人和搜索引擎等充当 HTTP 客户端,而 Web 服务器充当服务器。
客户端
HTTP 客户端通过 TCP/IP 连接以请求方法、URI 和协议版本的形式向服务器发送请求,后跟包含请求修改器、客户端信息和可能的正文内容的类似 MIME 的消息。
服务器
HTTP 服务器以状态行响应,包括消息的协议版本和成功或错误代码,后跟包含服务器信息、实体元信息和可能的实体正文内容的类似 MIME 的消息。
HTTP - 参数
本章将列出一些重要的 HTTP 协议参数及其在通信中使用的语法。例如,日期格式、URL 格式等。这将有助于您在编写 HTTP 客户端或服务器程序时构建请求和响应消息。在后续章节中解释 HTTP 请求和响应的消息结构时,您将看到这些参数的完整用法。
HTTP 版本
HTTP 使用<主版本>.<次版本>编号方案来指示协议的版本。HTTP 消息的版本由第一行中的 HTTP-Version 字段指示。以下是指定 HTTP 版本号的通用语法
HTTP-Version = "HTTP" "/" 1*DIGIT "." 1*DIGIT
示例
HTTP/1.0 or HTTP/1.1
统一资源标识符 (URI)
统一资源标识符 (URI) 是一种格式简单的、不区分大小写的字符串,包含名称、位置等信息,用于标识资源,例如网站、Web 服务等。用于 HTTP 的 URI 的通用语法如下
URI = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
如果端口为空或未给出,则 HTTP 假设为端口 80,而空的abs_path等效于"/"的abs_path。除保留和不安全集中的字符外,其他字符与其""%" HEX HEX"编码等效。
示例
以下两个 URI 等效
http://abc.com:80/~smith/home.html http://ABC.com/%7Esmith/home.html http://ABC.com:/%7esmith/home.html
日期/时间格式
所有 HTTP 日期/时间戳都必须以格林威治标准时间 (GMT) 表示,无一例外。HTTP 应用程序允许使用以下三种日期/时间戳表示形式中的任何一种
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
字符集
您可以使用字符集来指定客户端首选的字符集。多个字符集可以用逗号分隔列出。如果未指定值,则默认为 US-ASCII。
示例
以下是有效的字符集
US-ASCII or ISO-8859-1 or ISO-8859-7
内容编码
内容编码值表示在通过网络传递之前已使用编码算法对内容进行了编码。内容编码主要用于允许压缩文档或以其他有用的方式进行转换,而不会丢失标识。
所有内容编码值都不区分大小写。HTTP/1.1 在我们将在后续章节中看到的 Accept-Encoding 和 Content-Encoding 报头字段中使用内容编码值。
示例
以下是有效的编码方案
Accept-encoding: gzip or Accept-encoding: compress or Accept-encoding: deflate
媒体类型
HTTP 在Content-Type和Accept报头字段中使用 Internet 媒体类型,以提供开放且可扩展的数据类型和类型协商。所有媒体类型值都在互联网号码分配机构 (IANA) 注册。以下是指定媒体类型的通用语法
media-type = type "/" subtype *( ";" parameter )
类型、子类型和参数属性名称不区分大小写。
示例
Accept: image/gif
语言标签
HTTP 在Accept-Language和Content-Language字段中使用语言标签。语言标签由一个或多个部分组成:一个主语言标签和一个可能为空的子标签序列
language-tag = primary-tag *( "-" subtag )
标签内不允许使用空格,所有标签都不区分大小写。
示例
示例标签包括
en, en-US, en-cockney, i-cherokee, x-pig-latin
其中任何两个字母的主标签都是 ISO-639 语言缩写,任何两个字母的初始子标签都是 ISO-3166 国家代码。
HTTP - 消息
HTTP 基于客户端-服务器架构模型和无状态请求/响应协议,该协议通过在可靠的 TCP/IP 连接上交换消息来运行。
HTTP“客户端”是一个程序(Web 浏览器或任何其他客户端),它建立与服务器的连接,目的是发送一个或多个 HTTP 请求消息。HTTP“服务器”是一个程序(通常是 Web 服务器,如 Apache Web 服务器或 Internet Information Services IIS 等),它接受连接以通过发送 HTTP 响应消息来服务 HTTP 请求。
HTTP 利用统一资源标识符 (URI) 来识别给定的资源并建立连接。一旦连接建立,HTTP 消息就会以类似于互联网邮件 [RFC5322] 和多用途互联网邮件扩展 (MIME) [RFC2045] 使用的格式传递。这些消息由客户端到服务器的请求和服务器到客户端的响应组成,其格式如下
HTTP-message = <Request> | <Response> ; HTTP/1.1 messages
HTTP 请求和 HTTP 响应使用 RFC 822 的通用消息格式来传输所需的数据。此通用消息格式包含以下四个项目。
- A Start-line
- Zero or more header fields followed by CRLF
- An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
- Optionally a message-body
以下部分将解释 HTTP 消息中使用的每个实体。
消息起始行
起始行将具有以下通用语法
start-line = Request-Line | Status-Line
在分别讨论 HTTP 请求和 HTTP 响应消息时,我们将讨论请求行和状态行。现在让我们看看请求和响应情况下起始行的示例
GET /hello.htm HTTP/1.1 (This is Request-Line sent by the client) HTTP/1.1 200 OK (This is Status-Line sent by the server)
报头字段
HTTP 报头字段提供有关请求或响应,或有关在消息正文中发送的对象的必要信息。HTTP 消息报头有以下四种类型
通用报头:这些报头字段普遍适用于请求和响应消息。
请求报头:这些报头字段仅适用于请求消息。
响应报头:这些报头字段仅适用于响应消息。
实体报头:这些报头字段定义有关实体正文的元信息,或者如果不存在正文。
所有上述报头都遵循相同的通用格式,每个报头字段都由一个名称后跟一个冒号 (:) 和字段值组成,如下所示
message-header = field-name ":" [ field-value ]
以下是各种报头字段的示例
User-Agent: curl/7.16.3 libcurl/7.16.3 OpenSSL/0.9.7l zlib/1.2.3 Host: www.example.com Accept-Language: en, mi Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Accept-Ranges: bytes Content-Length: 51 Vary: Accept-Encoding Content-Type: text/plain
消息正文
消息正文部分对于 HTTP 消息是可选的,但如果可用,则用于携带与请求或响应关联的实体正文。如果关联了实体正文,则通常Content-Type和Content-Length报头行指定关联正文的性质。
消息正文是携带实际 HTTP 请求数据(包括表单数据和上传等)和服务器的 HTTP 响应数据(包括文件、图像等)的部分。以下是消息正文的一个简单内容
<html> <body> <h1>Hello, World!</h1> </body> </html>
HTTP - 请求
HTTP 客户端以请求消息的形式向服务器发送 HTTP 请求,该请求消息包括以下格式
- A Request-line
- Zero or more header (General|Request|Entity) fields followed by CRLF
- An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
- Optionally a message-body
以下部分将解释 HTTP 消息中使用的每个实体。
消息请求行
请求行以方法标记开头,后跟请求 URI 和协议版本,最后以 CRLF 结尾。元素之间用空格 SP 字符隔开。
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
让我们讨论请求行中提到的每个部分。
请求方法
请求方法指示要对由给定请求 URI标识的资源执行的方法。该方法区分大小写,应始终以大写形式提及。以下是 HTTP/1.1 中支持的方法
序号 | 方法和描述 |
---|---|
1 | GET GET 方法用于使用给定的 URI 从给定的服务器检索信息。使用 GET 的请求应该只检索数据,并且不应对数据产生其他影响。 |
2 | HEAD 与 GET 相同,但仅传输状态行和报头部分。 |
3 | POST POST 请求用于将数据发送到服务器,例如使用 HTML 表单的客户信息、文件上传等。 |
4 | PUT 用上传的内容替换目标资源的所有当前表示。 |
5 | DELETE 删除 URI 指定的目标资源的所有当前表示。 |
6 | CONNECT 建立到由给定 URI 标识的服务器的隧道。 |
7 | OPTIONS 描述目标资源的通信选项。 |
8 | TRACE 沿目标资源路径执行消息环回测试。 |
请求 URI
请求 URI 是一个统一资源标识符,它标识要对其应用请求的资源。以下是指定 URI 的最常用形式
Request-URI = "*" | absoluteURI | abs_path | authority
序号 | 方法和描述 |
---|---|
1 | 当 HTTP 请求不应用于特定资源,而是应用于服务器本身时,使用星号*,并且仅当使用的方法不一定应用于资源时才允许使用。例如 OPTIONS * HTTP/1.1 |
2 | 当向代理发出 HTTP 请求时,使用absoluteURI。请求代理转发请求或从有效缓存中提供服务,并返回响应。例如 GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.1 |
3 | Request-URI 最常见的形式是用于标识源服务器或网关上的资源。例如,客户端希望直接从源服务器检索上面的资源,它将创建一个到主机“www.w3.org”的 80 端口的 TCP 连接,并发送以下行: GET /pub/WWW/TheProject.html HTTP/1.1 请注意,绝对路径不能为空;如果原始 URI 中不存在任何路径,则必须将其指定为“/”(服务器根目录) |
请求报头字段
我们将在单独的章节中学习通用报头和实体报头,届时我们将学习 HTTP 报头字段。现在让我们检查一下请求报头字段是什么。
请求报头字段允许客户端向服务器传递有关请求以及客户端本身的附加信息。这些字段充当请求修饰符,并且可以使用以下重要的请求报头字段,具体取决于需求。
Accept-Charset
Accept-Encoding
Accept-Language
Authorization
Expect
From
Host
If-Match
If-Modified-Since
If-None-Match
If-Range
If-Unmodified-Since
Max-Forwards
Proxy-Authorization
Range
Referer
TE
User-Agent
如果您要编写自己的自定义客户端和 Web 服务器,则可以引入自定义字段。
请求消息示例
现在让我们将所有这些组合起来,形成一个 HTTP 请求,以从运行在 tutorialspoint.com 上的 Web 服务器获取hello.htm页面。
GET /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
这里我们没有向服务器发送任何请求数据,因为我们是从服务器获取一个简单的 HTML 页面。Connection 是此处使用的通用报头,其余报头是请求报头。下面是另一个示例,我们使用请求消息正文向服务器发送表单数据。
POST /cgi-bin/process.cgi HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Content-Type: application/x-www-form-urlencoded Content-Length: length Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive licenseID=string&content=string&/paramsXML=string
这里给定的 URL /cgi-bin/process.cgi 将用于处理传递的数据,并相应地返回响应。这里的content-type告诉服务器传递的数据是简单的 Web 表单数据,而length将是放入消息正文的数据的实际长度。以下示例显示如何将简单的 XML 传递到您的 Web 服务器。
POST /cgi-bin/process.cgi HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Content-Type: text/xml; charset=utf-8 Content-Length: length Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://clearforest.com/">string</string>
HTTP - 响应
服务器在接收和解释请求消息后,将返回 HTTP 响应消息。
- A Status-line
- Zero or more header (General|Response|Entity) fields followed by CRLF
- An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
- Optionally a message-body
以下部分将解释 HTTP 消息中使用的每个实体。
消息状态行
状态行由协议版本、数字状态代码及其关联的文本短语组成。这些元素用空格 (SP) 字符分隔。
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
让我们讨论状态行中提到的每个部分。
HTTP 版本
支持 HTTP 1.1 版本的服务器将返回以下版本信息:
HTTP-Version = HTTP/1.1
状态码
状态码元素是一个 3 位整数,其中状态码的第一位数字定义响应的类别,后两位数字没有任何分类作用。第一位数字有 5 个值。
序号 | 代码和描述 |
---|---|
1 | 1xx:信息性 这意味着请求已接收并正在继续处理。 |
2 | 2xx:成功 这意味着操作已成功接收、理解和接受。 |
3 | 3xx:重定向 这意味着必须采取进一步的操作才能完成请求。 |
4 | 4xx:客户端错误 这意味着请求包含错误的语法或无法完成。 |
5 | 5xx:服务器错误 服务器未能完成明显有效的请求。 |
HTTP 状态代码是可扩展的,HTTP 应用程序不需要理解所有已注册状态代码的含义。所有状态代码的列表已在单独的章节中提供,供您参考。
响应报头字段
我们将在单独的章节中学习通用报头和实体报头,届时我们将学习 HTTP 报头字段。现在让我们检查一下响应报头字段是什么。
响应报头字段允许服务器传递有关响应的附加信息,这些信息无法放置在状态行中。这些报头字段提供有关服务器以及进一步访问由 Request-URI 标识的资源的信息。
Accept-Ranges
Age
ETag
Location
Proxy-Authenticate
Retry-After
服务器
Vary
WWW-Authenticate
如果您要编写自己的自定义 Web 客户端和服务器,则可以引入自定义字段。
响应消息示例
现在让我们将所有这些组合起来,形成一个 HTTP 响应,以响应从运行在 tutorialspoint.com 上的 Web 服务器获取hello.htm页面的请求。
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed <html> <body> <h1>Hello, World!</h1> </body> </html>
以下是一个 HTTP 响应消息示例,显示当 Web 服务器找不到请求的页面时的错误情况。
HTTP/1.1 404 Not Found Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Connection: Closed Content-Type: text/html; charset=iso-8859-1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>404 Not Found</title> </head> <body> <h1>Not Found</h1> <p>The requested URL /t.html was not found on this server.</p> </body> </html>
以下是一个 HTTP 响应消息示例,显示当 Web 服务器在给定的 HTTP 请求中遇到错误的 HTTP 版本时的错误情况。
HTTP/1.1 400 Bad Request Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Content-Type: text/html; charset=iso-8859-1 Connection: Closed <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>400 Bad Request</title> </head> <body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<p> <p>The request line contained invalid characters following the protocol string.<p> </body> </html>
HTTP - 方法
HTTP/1.1 的常用方法集定义如下,并且可以根据需要扩展此方法集。这些方法名称区分大小写,必须使用大写。
序号 | 方法和描述 |
---|---|
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 方法
GET 请求通过在请求的 URL 部分中指定参数来从 Web 服务器检索数据。这是用于文档检索的主要方法。以下是一个简单的示例,它使用 GET 方法来获取 hello.htm。
GET /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
服务器对上述 GET 请求的响应如下:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Vary: Authorization,Accept Accept-Ranges: bytes Content-Length: 88 Content-Type: text/html Connection: Closed <html> <body> <h1>Hello, World!</h1> </body> </html>
HEAD 方法
HEAD 方法在功能上类似于 GET,只是服务器回复响应行和报头,但没有实体正文。以下是一个简单的示例,它使用 HEAD 方法来获取有关 hello.htm 的报头信息。
HEAD /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
服务器对上述 GET 请求的响应如下:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Vary: Authorization,Accept Accept-Ranges: bytes Content-Length: 88 Content-Type: text/html Connection: Closed
您可以注意到,此处服务器在报头之后没有发送任何数据。
POST 方法
当您想要向服务器发送一些数据时,例如文件更新、表单数据等,可以使用 POST 方法。以下是一个简单的示例,它使用 POST 方法向服务器发送表单数据,该数据将由 process.cgi 处理,最后返回响应。
POST /cgi-bin/process.cgi HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Content-Type: text/xml; charset=utf-8 Content-Length: 88 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive <?xml version="1.0" encoding="utf-8"?> <string xmlns="http://clearforest.com/">string</string>
服务器端脚本 process.cgi 处理传递的数据并发送以下响应:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT ETag: "34aa387-d-1568eb00" Vary: Authorization,Accept Accept-Ranges: bytes Content-Length: 88 Content-Type: text/html Connection: Closed <html> <body> <h1>Request Processed Successfully</h1> </body> </html>
PUT 方法
PUT 方法用于请求服务器将包含的实体正文存储在给定 URL 指定的位置。以下示例请求服务器将给定的实体正文保存在服务器根目录下的hello.htm中。
PUT /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Connection: Keep-Alive Content-type: text/html Content-Length: 182 <html> <body> <h1>Hello, World!</h1> </body> </html>
服务器将给定的实体正文存储在hello.htm文件中,并将以下响应发送回客户端。
HTTP/1.1 201 Created Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Content-type: text/html Content-length: 30 Connection: Closed <html> <body> <h1>The file was created.</h1> </body> </html>
DELETE 方法
DELETE 方法用于请求服务器删除给定 URL 指定位置的文件。以下示例请求服务器删除服务器根目录下的给定文件hello.htm。
DELETE /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Connection: Keep-Alive
服务器将删除提到的文件hello.htm,并将以下响应发送回客户端。
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Content-type: text/html Content-length: 30 Connection: Closed <html> <body> <h1>URL deleted.</h1> </body> </html>
CONNECT 方法
客户端使用 CONNECT 方法通过 HTTP 建立与 Web 服务器的网络连接。以下示例请求与运行在主机 tutorialspoint.com 上的 Web 服务器建立连接。
CONNECT www.tutorialspoint.com HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
与服务器建立连接,并将以下响应发送回客户端。
HTTP/1.1 200 Connection established Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32)
OPTIONS 方法
客户端使用 OPTIONS 方法来找出 Web 服务器支持哪些 HTTP 方法和其他选项。客户端可以为 OPTIONS 方法指定一个 URL,或者指定一个星号 (*) 来指代整个服务器。以下示例请求运行在 tutorialspoint.com 上的 Web 服务器支持的方法列表。
OPTIONS * HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
服务器将根据服务器的当前配置发送信息,例如:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Allow: GET,HEAD,POST,OPTIONS,TRACE Content-Type: httpd/unix-directory
TRACE 方法
TRACE 方法用于将 HTTP 请求的内容回显给请求者,这可以在开发时用于调试目的。以下示例显示了 TRACE 方法的用法。
TRACE / HTTP/1.1 Host: www.tutorialspoint.com User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
服务器将发送以下消息作为对上述请求的响应:
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Content-Type: message/http Content-Length: 39 Connection: Closed TRACE / HTTP/1.1 Host: www.tutorialspoint.com User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
HTTP - 状态码
服务器响应中的状态码元素是一个 3 位整数,其中状态码的第一位数字定义响应的类别,后两位数字没有任何分类作用。第一位数字有 5 个值。
序号 | 代码和描述 |
---|---|
1 | 1xx:信息性 这意味着请求已接收并正在继续处理。 |
2 | 2xx:成功 这意味着操作已成功接收、理解和接受。 |
3 | 3xx:重定向 这意味着必须采取进一步的操作才能完成请求。 |
4 | 4xx:客户端错误 这意味着请求包含错误的语法或无法完成。 |
5 | 5xx:服务器错误 服务器未能完成明显有效的请求。 |
HTTP 状态代码是可扩展的,HTTP 应用程序不需要理解所有已注册状态代码的含义。以下是所有状态代码的列表。
1xx:信息性
消息 | 描述 |
---|---|
100 Continue | 服务器只接收了请求的一部分,但只要它没有被拒绝,客户端就应该继续请求。 |
101 Switching Protocols | 服务器切换协议。 |
2xx:成功
消息 | 描述 |
---|---|
200 OK | 请求成功。 |
201 Created | 请求已完成,并创建了一个新的资源。 |
202 Accepted | 请求已被接受以进行处理,但处理尚未完成。 |
203 Non-authoritative Information | 实体报头中的信息来自本地副本或第三方副本,而不是来自原始服务器。 |
204 No Content | 响应中给出了状态代码和报头,但回复中没有实体正文。 |
205 Reset Content | 浏览器应清除用于此事务的表单以进行额外输入。 |
206 Partial Content | 服务器正在返回请求大小的部分数据。用于响应指定Range报头的请求。服务器必须使用Content-Range报头指定响应中包含的范围。 |
3xx:重定向
消息 | 描述 |
---|---|
300 Multiple Choices | 链接列表。用户可以选择一个链接并转到该位置。最多五个地址。 |
301 Moved Permanently | 请求的页面已永久移动到新的 URL。 |
302 Found | 请求的页面已临时移动到新的 URL。 |
303 See Other | 请求的页面可以在不同的 URL 下找到。 |
304 Not Modified | 这是对If-Modified-Since或If-None-Match报头的响应代码,其中 URL 自指定日期以来未被修改。 |
305 Use Proxy | 必须通过Location报头中提到的代理访问请求的 URL。 |
306 Unused | 此代码在早期版本中使用过。它不再使用,但代码已保留。 |
307 Temporary Redirect | 请求的页面已临时移动到新的 URL。 |
4xx:客户端错误
消息 | 描述 |
---|---|
400 Bad Request | 服务器不理解请求。 |
401 Unauthorized | 请求的页面需要用户名和密码。 |
402 Payment Required | 您尚不能使用此代码。 |
403 Forbidden | 禁止访问请求的页面。 |
404 Not Found | 服务器找不到请求的页面。 |
405 Method Not Allowed | 请求中指定的方法不允许。 |
406 Not Acceptable | 服务器只能生成客户端不接受的响应。 |
407 Proxy Authentication Required | 此请求需要您先通过代理服务器进行身份验证。 |
408 请求超时 | 请求时间超过服务器允许的等待时间。 |
409 冲突 | 由于冲突,请求无法完成。 |
410 已消失 | 请求的页面已不可用。 |
411 需要长度 | 未定义“Content-Length”。服务器在没有此字段的情况下将不接受请求。 |
412 预期失败 | 服务器评估请求中给定的前提条件为假。 |
413 请求实体过大 | 由于请求实体过大,服务器将不接受请求。 |
414 请求 URL 过长 | 由于 URL 过长,服务器将不接受请求。当您将长查询信息的“post”请求转换为“get”请求时会发生这种情况。 |
415 不支持的媒体类型 | 由于不支持媒体类型,服务器将不接受请求。 |
416 请求的范围无法满足 | 请求的字节范围不可用且超出范围。 |
417 期望失败 | 此服务器无法满足 Expect 请求头字段中给出的期望。 |
5xx:服务器错误
消息 | 描述 |
---|---|
500 内部服务器错误 | 请求未完成。服务器遇到意外情况。 |
501 未实现 | 请求未完成。服务器不支持所需的功能。 |
502 错误网关 | 请求未完成。服务器从上游服务器收到无效响应。 |
503 服务不可用 | 请求未完成。服务器暂时过载或宕机。 |
504 网关超时 | 网关超时。 |
505 HTTP 版本不受支持 | 服务器不支持此“HTTP 协议”版本。 |
HTTP - 报头字段
HTTP 报头字段提供有关请求或响应,或有关在消息正文中发送的对象的必要信息。HTTP 消息报头有以下四种类型
通用报头:这些报头字段普遍适用于请求和响应消息。
客户端请求头:这些头字段仅适用于请求消息。
服务器响应头:这些头字段仅适用于响应消息。
实体报头:这些报头字段定义有关实体正文的元信息,或者如果不存在正文。
通用报头
Cache-control
Cache-Control 通用报头字段用于指定所有缓存系统都必须遵守的指令。以下是语法:
Cache-Control : cache-request-directive|cache-response-directive
HTTP 客户端或服务器可以使用Cache-control通用报头来指定缓存参数或请求缓存中的某些类型的文档。缓存指令以逗号分隔的列表形式指定。例如:
Cache-control: no-cache
以下是客户端在其 HTTP 请求中可以使用的一些重要的缓存请求指令:
序号 | 缓存请求指令及描述 |
---|---|
1 | no-cache 缓存不能使用此响应来满足后续请求,除非与原始服务器成功重新验证。 |
2 | no-store 缓存不应存储有关客户端请求或服务器响应的任何信息。 |
3 | max-age = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
4 | max-stale [ = 秒 ] 指示客户端愿意接受已超过其过期时间的响应。如果给出了秒数,则其过期时间不得超过该时间。 |
5 | min-fresh = 秒 指示客户端愿意接受其新鲜度生命周期不小于其当前年龄加上指定秒数的响应。 |
6 | no-transform 不要转换实体主体。 |
7 | only-if-cached 不要检索新数据。只有当文档在缓存中时,缓存才能发送文档,并且不应联系原始服务器查看是否存在更新的副本。 |
以下是服务器在其 HTTP 响应中可以使用的一些重要的缓存响应指令:
序号 | 缓存请求指令及描述 |
---|---|
1 | public 指示任何缓存都可以缓存响应。 |
2 | private 指示响应消息的全部或部分内容仅供单个用户使用,共享缓存不得缓存。 |
3 | no-cache 缓存不能使用此响应来满足后续请求,除非与原始服务器成功重新验证。 |
4 | no-store 缓存不应存储有关客户端请求或服务器响应的任何信息。 |
5 | no-transform 不要转换实体主体。 |
6 | must-revalidate 缓存必须在使用过期文档之前验证其状态,并且不应使用已过期文档。 |
7 | proxy-revalidate proxy-revalidate 指令和 must-revalidate 指令具有相同的含义,只是它不适用于非共享用户代理缓存。 |
8 | max-age = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
9 | s-maxage = 秒 此指令指定的最大年龄将覆盖 max-age 指令或 Expires 头指定的最大年龄。私有缓存始终忽略 s-maxage 指令。 |
Connection
Connection 通用报头字段允许发送方指定该特定连接所需的选项,并且代理不得通过进一步的连接来传递这些选项。以下是使用连接头的简单语法:
Connection : "Connection"
HTTP/1.1 定义了“closed”连接选项,以便发送方发出信号,指示在响应完成之后将关闭连接。例如:
Connection: Closed
默认情况下,HTTP 1.1 使用持久连接,其中连接在事务完成后不会自动关闭。另一方面,HTTP 1.0 默认情况下不使用持久连接。如果 1.0 客户端希望使用持久连接,则它将使用以下keep-alive参数:
Connection: keep-alive
Date
所有 HTTP 日期/时间戳都必须以格林威治标准时间 (GMT) 表示,无一例外。HTTP 应用程序允许使用以下三种日期/时间戳表示形式中的任何一种
Sun, 06 Nov 1994 08:49:37 GMT ; RFC 822, updated by RFC 1123 Sunday, 06-Nov-94 08:49:37 GMT ; RFC 850, obsoleted by RFC 1036 Sun Nov 6 08:49:37 1994 ; ANSI C's asctime() format
这里第一个格式是最优选的。
Pragma
Pragma 通用报头字段用于包含可能适用于请求/响应链中任何收件人的实现特定指令。例如:
Pragma: no-cache
HTTP/1.0 中定义的唯一指令是 no-cache 指令,并在 HTTP 1.1 中为了向后兼容而保留。将来不会定义新的 Pragma 指令。
Trailer
Trailer 通用字段值指示给定的报头字段集存在于使用分块传输编码编码的消息的尾部。以下是 Trailer 报头字段的语法:
Trailer : field-name
Trailer 报头字段中列出的消息报头字段不得包括以下报头字段:
Transfer-Encoding
Content-Length
Trailer
Transfer-Encoding
Transfer-Encoding 通用报头字段指示已应用于消息正文的哪种类型的转换,以便在发送方和接收方之间安全地传输它。这与内容编码不同,因为传输编码是消息的属性,而不是实体主体的属性。以下是 Transfer-Encoding 报头字段的语法:
Transfer-Encoding: chunked
所有传输编码值都不区分大小写。
Upgrade
Upgrade 通用报头允许客户端指定它支持的附加通信协议,如果服务器认为切换协议是合适的,则可以使用这些协议。例如:
Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Upgrade 报头字段旨在为从 HTTP/1.1 过渡到其他不兼容的协议提供一种简单的机制。
Via
网关和代理必须使用Via通用报头来指示中间协议和接收者。例如,可以从代号为“fred”的内部代理(使用 HTTP/1.1 将请求转发到 nowhere.com 的公共代理)向 HTTP/1.0 用户代理发送请求消息,该公共代理通过将其转发到 www.ics.uci.edu 的原始服务器来完成请求。然后,www.ics.uci.edu 收到的请求将具有以下 Via 报头字段:
Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Upgrade 报头字段旨在为从 HTTP/1.1 过渡到其他不兼容的协议提供一种简单的机制。
Warning
Warning 通用报头用于携带有关消息状态或转换的附加信息,这些信息可能不会反映在消息中。响应可以携带多个 Warning 报头。
Warning : warn-code SP warn-agent SP warn-text SP warn-date
客户端请求头
Accept
Accept 请求头字段可用于指定响应可接受的某些媒体类型。以下是通用语法:
Accept: type/subtype [q=qvalue]
多个媒体类型可以用逗号分隔列出,可选的 q 值表示接受类型的可接受质量级别,范围为 0 到 1。以下是一个示例:
Accept: text/plain; q=0.5, text/html, text/x-dvi; q=0.8, text/x-c
这将被解释为text/html和text/x-c是首选媒体类型,但如果它们不存在,则发送text/x-dvi实体,如果该实体也不存在,则发送text/plain实体。
Accept-Charset
Accept-Charset 请求头字段可用于指示响应可接受的字符集。以下是通用语法:
Accept-Charset: character_set [q=qvalue]
多个字符集可以用逗号分隔列出,可选的 q 值表示非首选字符集的可接受质量级别,范围为 0 到 1。以下是一个示例:
Accept-Charset: iso-8859-5, unicode-1-1; q=0.8
如果Accept-Charset字段中存在特殊值“*”,则它匹配每个字符集;如果没有Accept-Charset报头,则默认为任何字符集都是可接受的。
Accept-Encoding
Accept-Encoding 请求头字段类似于 Accept,但它限制了响应中可接受的内容编码。以下是通用语法:
Accept-Encoding: encoding types
以下是示例:
Accept-Encoding: compress, gzip Accept-Encoding: Accept-Encoding: * Accept-Encoding: compress;q=0.5, gzip;q=1.0 Accept-Encoding: gzip;q=1.0, identity; q=0.5, *;q=0
Accept-Language
Accept-Language 请求头字段类似于 Accept,但它限制了作为对请求的响应而首选的自然语言集。以下是通用语法:
Accept-Language: language [q=qvalue]
多个语言可以用逗号分隔列出,可选的 q 值表示非首选语言的可接受质量级别,范围为 0 到 1。以下是一个示例:
Accept-Language: da, en-gb;q=0.8, en;q=0.7
Authorization
Authorization 请求头字段值包含凭据,其中包含用户代理对请求资源领域的认证信息。以下是通用语法:
Authorization : credentials
HTTP/1.0 规范定义了 BASIC 授权方案,其中授权参数是用 base 64 编码的用户名:密码字符串。以下是一个示例:
Authorization: BASIC Z3Vlc3Q6Z3Vlc3QxMjM=
该值解码为guest:guest123,其中guest是用户 ID,guest123是密码。
Cookie
Cookie 请求头字段值包含为该 URL 存储的名称/值对信息。以下是通用语法:
Cookie: name=value
可以使用分号分隔指定多个 Cookie,如下所示:
Cookie: name1=value1;name2=value2;name3=value3
Expect
Expect 请求头字段用于指示客户端需要特定的服务器行为。以下是通用语法:
Expect : 100-continue | expectation-extension
如果服务器收到包含 Expect 字段的请求,该字段包含它不支持的期望扩展,则它必须以 417(期望失败)状态响应。
From
From 请求头字段包含控制请求用户代理的人类用户的互联网电子邮件地址。以下是一个简单的示例:
From: [email protected]
此报头字段可用于日志记录目的,以及识别无效或不需要的请求来源的方法。
Host
Host 请求头字段用于指定正在请求的资源的互联网主机和端口号。以下是通用语法:
Host : "Host" ":" host [ ":" port ] ;
没有尾随端口信息的主机表示默认端口,即 80。例如,对原始服务器的http://www.w3.org/pub/WWW/请求将是:
GET /pub/WWW/ HTTP/1.1 Host: www.w3.org
If-Match
If-Match 请求头字段用于使用方法使其成为条件。此报头请求服务器仅在该标记中的给定值与ETag表示的给定实体标记匹配时才执行请求的方法。以下是通用语法:
If-Match : entity-tag
星号 (*) 匹配任何实体,并且事务仅在实体存在时才继续。以下是可能的示例:
If-Match: "xyzzy" If-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" If-Match: *
如果没有实体标记匹配,或者如果给出“*”并且不存在当前实体,则服务器不得执行请求的方法,并且必须返回 412(前提条件失败)响应。
If-Modified-Since
If-Modified-Since 请求头字段用于使用方法使其成为条件。如果请求的 URL 自此字段中指定的时间以来未被修改,则不会从服务器返回实体;而是将返回 304(未修改)响应,没有任何消息正文。以下是通用语法:
If-Modified-Since : HTTP-date
此字段的一个示例是:
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果没有实体标记匹配,或者如果给出“*”并且不存在当前实体,则服务器不得执行请求的方法,并且必须返回 412(前提条件失败)响应。
If-None-Match
If-None-Match 请求头字段用于使方法具有条件性。此标头请求服务器仅当此标签中给定的值之一与由ETag表示的给定实体标签匹配时,才执行请求的方法。以下是通用语法
If-None-Match : entity-tag
星号 (*) 匹配任何实体,并且只有在实体不存在时事务才会继续。以下是可能的示例
If-None-Match: "xyzzy" If-None-Match: "xyzzy", "r2d2xxxx", "c3piozzzz" If-None-Match: *
If-Range
If-Range 请求头字段可以与条件 GET 一起使用,以请求仅请求实体中缺少的部分(如果它没有更改),如果它已更改,则请求整个实体。以下是通用语法
If-Range : entity-tag | HTTP-date
可以使用实体标签或日期来标识已经接收的部分实体。例如
If-Range: Sat, 29 Oct 1994 19:43:31 GMT
如果文档自给定日期以来未被修改,则服务器返回由 Range 标头给定的字节范围,否则,它返回所有新文档。
If-Unmodified-Since
If-Unmodified-Since 请求头字段用于使方法具有条件性。以下是通用语法
If-Unmodified-Since : HTTP-date
如果请求的资源自此字段中指定的时间以来未被修改,则服务器应执行请求的操作,就好像不存在 If-Unmodified-Since 标头一样。例如
If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT
如果请求通常会导致 2xx 或 412 状态以外的任何状态,则应忽略If-Unmodified-Since 标头。
Max-Forwards
Max-Forwards 请求头字段为 TRACE 和 OPTIONS 方法提供了一种机制,用于限制可以将请求转发到下一个入站服务器的代理或网关的数量。以下是通用语法
Max-Forwards : n
Max-Forwards 值是一个十进制整数,指示此请求消息可以被转发的剩余次数。这对于使用 TRACE 方法进行调试,避免无限循环很有用。例如
Max-Forwards : 5
对于 HTTP 规范中定义的所有其他方法,都可以忽略 Max-Forwards 标头字段。
Proxy-Authorization
Proxy-Authorization 请求头字段允许客户端向需要身份验证的代理标识自身(或其用户)。以下是通用语法
Proxy-Authorization : credentials
Proxy-Authorization 字段值包含凭据,其中包含用户代理对于代理和/或请求资源的领域的认证信息。
Range
Range 请求头字段指定从文档请求的内容的部分范围。以下是通用语法
Range: bytes-unit=first-byte-pos "-" [last-byte-pos]
字节范围规范中的 first-byte-pos 值给出范围中第一个字节的字节偏移量。last-byte-pos 值给出范围中最后一个字节的字节偏移量;也就是说,指定的字节位置是包含的。您可以将字节单位指定为 bytes 字节偏移量从零开始。以下是一些简单的示例
- The first 500 bytes Range: bytes=0-499 - The second 500 bytes Range: bytes=500-999 - The final 500 bytes Range: bytes=-500 - The first and last bytes only Range: bytes=0-0,-1
可以列出多个范围,用逗号分隔。如果逗号分隔的字节范围中的第一个数字缺失,则假定该范围从文档末尾开始计数。如果第二个数字缺失,则范围为字节 n 到文档末尾。
Referer
Referer 请求头字段允许客户端指定已请求 URL 的资源的地址 (URI)。以下是通用语法
Referer : absoluteURI | relativeURI
以下是一个简单的示例
Referer: http://www.tutorialspoint.org/http/index.htm
如果字段值是相对 URI,则应将其相对于Request-URI解释。
TE
TE 请求头字段指示它愿意在响应中接受什么扩展传输编码以及它是否愿意在分块传输编码中接受尾部字段。以下是通用语法
TE : t-codings
关键字“trailers”的存在表示客户端愿意在分块传输编码中接受尾部字段,并且可以通过以下两种方式之一指定
TE: deflate TE: TE: trailers, deflate;q=0.5
如果 TE 字段值为空,或者不存在 TE 字段,则唯一的传输编码是chunked。始终可以接受没有传输编码的消息。
User-Agent
User-Agent 请求头字段包含有关发起请求的用户代理的信息。以下是通用语法
User-Agent : product | comment
示例
User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT)
服务器响应头
Accept-Ranges
Accept-Ranges 响应头字段允许服务器指示其对资源的范围请求的接受情况。以下是通用语法
Accept-Ranges : range-unit | none
例如,接受字节范围请求的服务器可能会发送
Accept-Ranges: bytes
不接受任何类型的资源范围请求的服务器可能会发送
Accept-Ranges: none
这将建议客户端不要尝试范围请求。
Age
Age 响应头字段传达发送者对自响应(或其重新验证)在原始服务器上生成以来的时间的估计值。以下是通用语法
Age : delta-seconds
Age 值是非负十进制整数,以秒为单位表示时间。以下是一个简单的示例
Age: 1030
包含缓存的 HTTP/1.1 服务器必须在其自己的缓存生成的每个响应中包含 Age 标头字段。
ETag
ETag 响应头字段提供请求变体的实体标签的当前值。以下是通用语法
ETag : entity-tag
以下是简单的示例
ETag: "xyzzy" ETag: W/"xyzzy" ETag: ""
Location
Location 响应头字段用于将接收者重定向到请求 URI 以外的位置以完成操作。以下是通用语法
Location : absoluteURI
以下是一个简单的示例
Location: http://www.tutorialspoint.org/http/index.htm
Content-Location 头字段与 Location 的区别在于,Content-Location 标识请求中包含的实体的原始位置。
Proxy-Authenticate
Proxy-Authenticate 响应头字段必须作为 407 (Proxy Authentication Required) 响应的一部分包含在内。以下是通用语法
Proxy-Authenticate : challenge
Retry-After
Retry-After 响应头字段可以与 503 (Service Unavailable) 响应一起使用,以指示服务预计对请求客户端不可用的时间长度。以下是通用语法
Retry-After : HTTP-date | delta-seconds
以下是两个简单的示例
Retry-After: Fri, 31 Dec 1999 23:59:59 GMT Retry-After: 120
在后一个示例中,延迟为 2 分钟。
服务器
Server 响应头字段包含有关原始服务器用来处理请求的软件的信息。以下是通用语法
Server : product | comment
以下是一个简单的示例
Server: Apache/2.2.14 (Win32)
如果响应正在通过代理转发,则代理应用程序不得修改 Server 响应头。
Set-Cookie
Set-Cookie 响应头字段包含要为此 URL 保留的名称/值对信息。以下是通用语法
Set-Cookie: NAME=VALUE; OPTIONS
Set-Cookie 响应头包括令牌 Set-Cookie:,后跟一个或多个 Cookie 的逗号分隔列表。以下是可以指定为选项的可能值
序号 | 选项和说明 |
---|---|
1 | Comment=comment 此选项可用于指定与 Cookie 关联的任何注释。 |
2 | Domain=domain Domain 属性指定 Cookie 有效的域。 |
3 | Expires=Date-time Cookie 将过期的日期。如果为空,则 Cookie 将在访问者退出浏览器时过期 |
4 | Path=path Path 属性指定此 Cookie 应用于的 URL 子集。 |
5 | Secure 这指示用户代理仅在安全连接下返回 Cookie。 |
以下是由服务器生成的简单 Cookie 头的示例
Set-Cookie: name1=value1,name2=value2; Expires=Wed, 09 Jun 2021 10:18:14 GMT
Vary
Vary 响应头字段指定实体具有多个来源,因此可能根据指定的请求头列表而有所不同。以下是通用语法
Vary : field-name
您可以用逗号分隔多个标头,星号“*”的值表示未指定的参数不限于请求标头。以下是一个简单的示例
Vary: Accept-Language, Accept-Encoding
这里的字段名称不区分大小写。
WWW-Authenticate
WWW-Authenticate 响应头字段必须包含在 401 (Unauthorized) 响应消息中。字段值包含至少一个挑战,该挑战指示适用于 Request-URI 的身份验证方案和参数。以下是通用语法
WWW-Authenticate : challenge
WWW-Authenticate 字段值,因为它可能包含多个挑战,或者如果提供了多个 WWW-Authenticate 标头字段,则挑战本身的内容可以包含逗号分隔的身份验证参数列表。以下是一个简单的示例
WWW-Authenticate: BASIC realm="Admin"
实体头
Allow
Allow 实体头字段列出由 Request-URI 标识的资源支持的一组方法。以下是通用语法
Allow : Method
您可以用逗号分隔多个方法。以下是一个简单的示例
Allow: GET, HEAD, PUT
此字段无法阻止客户端尝试其他方法。
Content-Encoding
Content-Encoding 实体头字段用作媒体类型的修饰符。以下是通用语法
Content-Encoding : content-coding
内容编码是 Request-URI 标识的实体的特征。以下是一个简单的示例
Content-Encoding: gzip
如果请求消息中实体的内容编码对于原始服务器不可接受,则服务器应以 415 (Unsupported Media Type) 的状态代码进行响应。
Content-Language
Content-Language 实体头字段描述封闭实体的目标受众的自然语言。以下是通用语法
Content-Language : language-tag
可以为面向多个受众的内容列出多种语言。以下是一个简单的示例
Content-Language: mi, en
Content-Language 的主要目的是允许用户根据用户自己的首选语言来识别和区分实体。
Content-Length
Content-Length 实体头字段指示发送给接收者的实体正文的大小(以十进制 OCTET 为单位),或者在 HEAD 方法的情况下,如果请求是 GET,则指示发送的实体正文的大小。以下是通用语法
Content-Length : DIGITS
以下是一个简单的示例
Content-Length: 3495
任何大于或等于零的 Content-Length 都是有效值。
Content-Location
Content-Location 实体头字段可用于在该实体可从请求资源的 URI 分开的位置访问时,为消息中包含的实体提供资源位置。以下是通用语法
Content-Location: absoluteURI | relativeURI
以下是一个简单的示例
Content-Location: http://www.tutorialspoint.org/http/index.htm
Content-Location 的值还定义实体的基本 URI。
Content-MD5
可以使用Content-MD5实体报头字段提供实体的MD5摘要,用于接收时检查消息的完整性。以下是通用语法
Content-MD5 : md5-digest using base64 of 128 bit MD5 digest as per RFC 1864
以下是一个简单的示例
Content-MD5 : 8c2d46911f3f5a326455f0ed7a8ed3b3
MD5摘要是根据实体正文的内容计算的,包括已应用的任何内容编码,但不包括应用于消息正文的任何传输编码。
Content-Range
Content-Range实体报头字段与部分实体正文一起发送,用于指定在完整实体正文中的何处应用部分正文。以下是通用语法
Content-Range : bytes-unit SP first-byte-pos "-" last-byte-pos
假设实体总共包含 1234 个字节,以下是字节内容范围规范值的示例
- The first 500 bytes: Content-Range : bytes 0-499/1234 - The second 500 bytes: Content-Range : bytes 500-999/1234 - All except for the first 500 bytes: Content-Range : bytes 500-1233/1234 - The last 500 bytes: Content-Range : bytes 734-1233/1234
当 HTTP 消息包含单个范围的内容时,此内容将与 Content-Range 头部一起传输,并且 Content-Length 头部显示实际传输的字节数。例如:
HTTP/1.1 206 Partial content Date: Wed, 15 Nov 1995 06:25:24 GMT Last-Modified: Wed, 15 Nov 1995 04:58:08 GMT Content-Range: bytes 21010-47021/47022 Content-Length: 26012 Content-Type: image/gif
Content-Type
Content-Type实体报头字段指示发送给接收者的实体正文的媒体类型,或者在 HEAD 方法的情况下,指示如果请求是 GET 方法则将发送的媒体类型。以下是通用语法
Content-Type : media-type
以下是一个示例
Content-Type: text/html; charset=ISO-8859-4
Expires
Expires实体报头字段给出响应被认为过时后的日期/时间。以下是通用语法
Expires : HTTP-date
以下是一个示例
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Last-Modified
Last-Modified实体报头字段指示源服务器认为变体最后修改的日期和时间。以下是通用语法
Last-Modified: HTTP-date
以下是一个示例
Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT
HTTP - 缓存
HTTP 通常用于分布式信息系统,其中可以使用响应缓存来提高性能。HTTP/1.1 协议包含许多旨在使缓存工作的元素。
HTTP/1.1 中缓存的目标是在许多情况下无需发送请求,并在许多其他情况下无需发送完整响应。
HTTP/1.1 中的基本缓存机制是对缓存的隐式指令,其中服务器指定过期时间和验证器。我们为此目的使用Cache-Control 标头。
Cache-Control 标头允许客户端或服务器在请求或响应中传输各种指令。这些指令通常会覆盖默认的缓存算法。缓存指令以逗号分隔的列表形式指定。例如:
Cache-control: no-cache
以下是客户端在其 HTTP 请求中可以使用的一些重要的缓存请求指令:
序号 | 缓存请求指令及描述 |
---|---|
1 | no-cache 缓存不能使用此响应来满足后续请求,除非与原始服务器成功重新验证。 |
2 | no-store 缓存不应存储有关客户端请求或服务器响应的任何信息。 |
3 | max-age = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
4 | max-stale [ = 秒 ] 指示客户端愿意接受已超过其过期时间的响应。如果给出了秒数,则其过期时间不得超过该时间。 |
5 | min-fresh = 秒 指示客户端愿意接受其新鲜度生命周期不小于其当前年龄加上指定秒数的响应。 |
6 | no-transform 不要转换实体主体。 |
7 | only-if-cached 不要检索新数据。只有当文档在缓存中时,缓存才能发送文档,并且不应联系原始服务器查看是否存在更新的副本。 |
以下是服务器在其 HTTP 响应中可以使用的一些重要的缓存响应指令:
序号 | 缓存响应指令和说明 |
---|---|
1 | public 指示任何缓存都可以缓存响应。 |
2 | private 指示响应消息的全部或部分内容仅供单个用户使用,共享缓存不得缓存。 |
3 | no-cache 缓存不能使用此响应来满足后续请求,除非与原始服务器成功重新验证。 |
4 | no-store 缓存不应存储有关客户端请求或服务器响应的任何信息。 |
5 | no-transform 不要转换实体主体。 |
6 | must-revalidate 缓存必须在使用过期文档之前验证其状态,并且不应使用已过期文档。 |
7 | proxy-revalidate proxy-revalidate 指令和 must-revalidate 指令具有相同的含义,只是它不适用于非共享用户代理缓存。 |
8 | max-age = 秒 指示客户端愿意接受年龄不超过指定秒数的响应。 |
9 | s-maxage = 秒 此指令指定的最大年龄将覆盖 max-age 指令或 Expires 头指定的最大年龄。私有缓存始终忽略 s-maxage 指令。 |
HTTP - URL 编码
HTTP URL 只能使用 ASCII 字符集通过互联网发送,这些字符集通常包含 ASCII 集之外的字符。因此,必须将这些不安全的字符替换为% 后跟两位十六进制数字。
下表显示了字符的 ASCII 符号及其等效符号,最后是可以在传递到服务器之前在 URL 中使用的替换。
ASCII | 符号 | 替换 |
---|---|---|
< 32 | 使用 %xx 编码,其中 xx 是字符的十六进制表示。 | |
32 | 空格 | + 或 %20 |
33 | ! | %21 |
34 | " | %22 |
35 | # | %23 |
36 | $ | %24 |
37 | % | %25 |
38 | & | %26 |
39 | ' | %27 |
40 | ( | %28 |
41 | ) | %29 |
42 | * | * |
43 | + | %2B |
44 | , | %2C |
45 | - | - |
46 | . | . |
47 | / | %2F |
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 | 使用 %xx 编码,其中 xx 是字符的十六进制表示。 |
HTTP - 安全性
HTTP 用于互联网上的通信,因此应用程序开发人员、信息提供商和用户应该了解 HTTP/1.1 中的安全限制。本讨论不包含此处提及问题的最终解决方案,但它确实提出了一些减少安全风险的建议。
个人信息泄露
HTTP 客户端通常掌握大量个人信息,例如用户的姓名、位置、邮件地址、密码、加密密钥等。因此,您应该非常小心,避免通过 HTTP 协议无意中将这些信息泄露给其他来源。
所有机密信息都应以加密形式存储在服务器端。
透露服务器的特定软件版本可能会使服务器机器更容易受到针对已知包含安全漏洞的软件的攻击。
充当网络防火墙门户的代理应特别注意传输标识防火墙后主机的标头信息。
在“发件人”字段中发送的信息可能会与用户的隐私权益或其网站的安全策略冲突,因此不应在用户能够禁用、启用和修改字段内容的情况下传输。
如果引用页面是使用安全协议传输的,则客户端不应在(不安全)HTTP 请求中包含 Referer 标头字段。
使用 HTTP 协议的服务作者不应使用基于 GET 的表单提交敏感数据,因为这会导致这些数据被编码到 Request-URI 中。
基于文件和路径名的攻击
文档应仅限于 HTTP 请求返回的文档,这些文档仅为服务器管理员预期的文档。
例如,UNIX、Microsoft Windows 和其他操作系统使用.. 作为路径组件来指示高于当前目录的目录级别。在这样的系统上,如果 HTTP 服务器否则允许访问 HTTP 服务器之外的资源,则 HTTP 服务器必须禁止 Request-URI 中的任何此类构造。
DNS 欺骗
使用 HTTP 的客户端严重依赖域名服务,因此通常容易受到基于故意错误关联 IP 地址和 DNS 名称的安全攻击。因此,客户端在假设 IP 号码/DNS 名称关联的持续有效性时需要谨慎。
如果 HTTP 客户端缓存主机名查找的结果以提高性能,则它们必须遵守 DNS 报告的 TTL 信息。如果 HTTP 客户端不遵守此规则,则当先前访问的服务器的 IP 地址更改时,它们可能会被欺骗。
位置标头和欺骗
如果单个服务器支持多个互不信任的组织,则它必须检查在所述组织控制下生成的响应中的 Location 和 Content-Location 标头的值,以确保它们不会尝试使它们无权使用的资源无效。
身份验证凭据
现有的 HTTP 客户端和用户代理通常无限期地保留身份验证信息。HTTP/1.1 没有提供服务器指示客户端丢弃这些缓存的凭据的方法,这是一个很大的安全风险。
有一些解决这个问题部分问题的变通方法,因此建议使用屏幕保护程序中的密码保护、空闲超时和其他方法来减轻此问题固有的安全问题。
代理和缓存
HTTP 代理是中间人,代表了中间人攻击的机会。代理可以访问安全相关信息、有关个体用户和组织的个人信息以及属于用户和内容提供商的专有信息。
代理运营商应像保护任何包含或传输敏感信息的系统一样保护运行代理的系统。
缓存代理提供了额外的潜在漏洞,因为缓存的内容代表了恶意利用的有吸引力的目标。因此,应将缓存内容作为敏感信息来保护。
HTTP - 消息示例
示例 1
HTTP 请求从运行在 tutorialspoint.com 上的 Web 服务器获取hello.htm页面
客户端请求
GET /hello.htm HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
服务器响应
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed <html> <body> <h1>Hello, World!</h1> </body> </html>
示例 2
HTTP 请求获取运行在 tutorialspoint.com 上的 Web 服务器上不存在的t.html页面
客户端请求
GET /t.html HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
服务器响应
HTTP/1.1 404 Not Found Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Content-Type: text/html; charset=iso-8859-1 Connection: close <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>404 Not Found</title> </head> <body> <h1>Not Found</h1> <p>The requested URL /t.html was not found on this server.</p> </body> </html>
示例 3
HTTP 请求从运行在 tutorialspoint.com 上的 Web 服务器获取hello.htm页面,但请求使用错误的 HTTP 版本
客户端请求
GET /hello.htm HTTP1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive
服务器响应
HTTP/1.1 400 Bad Request Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Content-Type: text/html; charset=iso-8859-1 Connection: close <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html> <head> <title>400 Bad Request</title> </head> <body> <h1>Bad Request</h1> <p>Your browser sent a request that this server could not understand.<p> <p>The request line contained invalid characters following the protocol string.<p> </body> </html>
示例 4
HTTP 请求将表单数据发布到运行在 tutorialspoint.com 上的 Web 服务器上的process.cgi CGI 页面。服务器在将它们设置为 Cookie 后返回传递的名称
客户端请求
POST /cgi-bin/process.cgi HTTP/1.1 User-Agent: Mozilla/4.0 (compatible; MSIE5.01; Windows NT) Host: www.tutorialspoint.com Content-Type: text/xml; charset=utf-8 Content-Length: 60 Accept-Language: en-us Accept-Encoding: gzip, deflate Connection: Keep-Alive first=Zara&last=Ali
服务器响应
HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Content-Length: 88 Set-Cookie: first=Zara,last=Ali;domain=tutorialspoint.com;Expires=Mon, 19- Nov-2010 04:38:14 GMT;Path=/ Content-Type: text/html Connection: Closed <html> <body> <h1>Hello Zara Ali</h1> </body> </html>