原文:RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1 (ietf.org)
(因本篇RFC较长,将其分为几篇文章进行翻译)
超文本传输协议——HTTP/1.1
超文本传输协议 (HTTP) 是分布式、协作、超媒体信息系统的应用层协议。它是一种通用的、无状态的协议,通过扩展其请求方法、错误代码和标头 [47],可用于超文本之外的许多任务,例如名称服务器和分布式对象管理系统。 HTTP 的一个特性是数据表示的类型化和协商,允许独立于正在传输的数据构建系统。
自 1990 年以来,万维网全球信息倡议一直在使用 HTTP。该规范定义了称为“HTTP/1.1”的协议,是对 RFC 2068 [33] 的更新。
目录
1 简介
1.1 目的
1.2 要求
1.3 术语
1.4 整体运作
2 符号约定和通用语法
2.1 增强 BNF
2.2 基本规则
3 协议参数
3.1 HTTP 版本
3.2 统一资源标识符
3.2.1 一般语法
3.2.2 http网址
3.2.3 URI比较
3.3 日期/时间格式
3.3.1 完整日期
3.3.2 增量秒
3.4 字符集
3.4.1 缺少字符集
3.5 内容编码
3.6 传输编码
3.6.1 分块传输编码
3.7 媒体类型
3.7.1 规范化和文本默认值
3.7.2 多部分类型
3.8 产品代币
3.9 质量价值观
3.10 语言标签
3.11 实体标签
3.12 范围单位
4 HTTP 消息
4.1 消息类型
4.2 消息头
4.3 消息体
4.4 消息长度
4.5 通用头域
5 请求
5.1 请求行
5.1.1 方法
5.1.2 请求-URI
5.2 请求标识的资源
5.3 请求头域
6 回应
6.1 状态行
6.1.1 状态码和原因短语
6.2 响应头域
7 实体
7.1 实体头字段
7.2 实体
7.2.1 类型
7.2.2 实体长度
8. 连接
8.1 持久连接
8.1.1 目的
8.1.2 整体运作
8.1.3 代理服务器
8.1.4 实际考虑
8.2 消息传输要求
8.2.1 持久连接和流控制
8.2.2 监控错误状态消息的连接
8.2.3 100(继续)状态的使用
8.2.4 服务器过早关闭连接时的客户端行为
9 方法定义
9.1 安全和幂等方法
9.1.1 安全方法
9.1.2 幂等方法
9.2 选项 Options
9.3 Get
9.4 Head
9.5 Post
9.6 Put
9.7 Delete
9.8 跟踪 Trace
9.9 连接 Connect
10 状态码定义
10.1 信息 1xx
10.1.1 100 继续
10.1.2 101 交换协议
10.2 成功2xx
10.2.1 200 正常
10.2.2 201 创建
10.2.3 202 接受
10.2.4 203 非权威信息
10.2.5 204 无内容
10.2.6 205 重置内容
10.2.7 206 部分内容
10.3 重定向 3xx
10.3.1 300 多项选择
10.3.2 301 永久移动
10.3.3 302 找到
10.3.4 303 见其他
10.3.5 304 未修改
10.3.6 305 使用代理
10.3.7 306(未使用)
10.3.8 307 临时重定向
10.4 客户端错误 4xx
10.4.1 400 错误请求
10.4.2 401 未经授权
10.4.3 402 需要付款 Payment Required
10.4.4 403 禁止
10.4.5 404 未找到
10.4.6 405 方法不允许
10.4.7 406 不可接受
10.4.8 407 需要代理验证
10.4.9 408 请求超时
10.4.10 409 冲突
10.4.11 410 Gone
10.4.12 411 长度要求
10.4.13 412 前置条件失败
10.4.14 413 请求实体太大
10.4.15 414 请求 URI 太长
10.4.16 415 不支持的媒体类型
10.4.17 416 请求的范围不满足
10.4.18 417 预期失败
10.5 服务器错误 5xx
10.5.1 500 内部服务器错误
10.5.2 501 未实施
10.5.3 502 错误网关
10.5.4 503 服务不可用
10.5.5 504 网关超时
10.5.6 505 HTTP 版本不支持
11 访问认证
12 内容协商
12.1 服务器驱动的协商
12.2 代理驱动的协商
12.3 透明协商
13 HTTP 中的缓存
13.1.1 缓存正确性
13.1.2 警告
13.1.3 缓存控制机制
13.1.4 显式用户代理警告
13.1.5 规则和警告的例外情况
13.1.6 客户端控制的行为
13.2 到期模型
13.2.1 服务器指定的过期时间
13.2.2 启发式过期
13.2.3 年龄计算 Age Calculations
13.2.4 到期计算
13.2.5 消除过期值的歧义
13.2.6 消除多重响应的歧义
13.3 验证模型
13.3.1 最后修改日期
13.3.2 实体标签缓存验证器
13.3.3 弱验证器和强验证器
13.3.4 何时使用实体标签和最后修改日期的规则
13.3.5 非验证条件
13.4 响应可缓存性
13.5 从缓存构造响应
13.5.1 端到端和逐跳报头
13.5.2 不可修改的头文件
13.5.3 组合标题
13.5.4 组合字节范围
13.6 缓存协商响应
13.7 共享和非共享缓存
13.8 错误或不完整的响应缓存行为
13.9 GET 和 HEAD 的副作用
13.10 更新或删除后失效
13.11 强制直写
13.12 缓存替换
13.13 历史列表
14 标题字段定义
14.1 接受
14.2 接受字符集
14.3 接受编码
14.4 接受语言
14.5 接受范围
14.6 年龄
14.7 允许
14.8 授权
14.9 缓存控制
14.9.1 什么是可缓存的
14.9.2 缓存可以存储什么
14.9.3 基本过期机制的修改
14.9.4 缓存重新验证和重新加载控制
14.9.5 无变换指令
14.9.6 缓存控制扩展
14.10 连接
14.11 内容-编码
14.12 内容-语言
14.13 内容-长度
14.14 内容-位置
14.15 内容-MD5
14.16 内容-范围
14.17 内容-类型
14.18 日期
14.18.1 无时钟源服务器操作
14.19 电子标签 Etag
14.20 期待 Expect
14.21 到期 Expires
14.22 从 From
14.23 主机
14.24 如果匹配 If-Match
14.25 If-Modified-Since
14.26 If-None-Match
14.27 如果范围If-Range
14.28 If-Unmodified-Since
14.29 最后修改 Last-Modified
14.30 地点 Location
14.31 最大转发 Max-Forwards
14.32 杂注 Pragma
14.33 代理认证 Proxy-Authenticate
14.34 代理授权 Proxy-Authorization
14.35 范围
14.35.1 字节范围 Byte Ranges
14.35.2 范围检索请求 Range Retrieval Requests
14.36 推荐人 Referer
14.37 重试后 Retry-After
14.38 服务器
14.39 TE
14.40 预告片 Trailer
14.41 传输编码 Transfer-Encoding
14.42 升级 Upgrade
14.43 用户代理 User-Agent
14.44 变化 Vary
14.45 过孔 Via
14.46 警告 Warning
14.47 WWW-认证 WWW-Authenticate
15 安全注意事项
15.1 个人信息
15.1.1 滥用服务器日志信息
15.1.2 敏感信息的传输
15.1.3 在 URI 中编码敏感信息
15.1.4 与接受标头相关的隐私问题
15.2 基于文件名和路径名的攻击
15.3 DNS 欺骗
15.4 位置标头和欺骗
15.5 内容处置问题 Content-Disposition Issues
15.6 身份验证凭证和空闲客户端
15.7 代理和缓存
15.7.1 对代理的拒绝服务攻击
16 致谢
17 参考文献
18 作者地址
19 附录
19.1 Internet 媒体类型 message/http 和 application/http
19.2 互联网媒体类型 multipart/byteranges
19.3 容差应用
19.4 HTTP 实体和 RFC 2045 实体之间的区别
19.4.1 MIME 版本
19.4.2 转换为规范形式
19.4.3 日期格式的转换
19.4.4 Content-Encoding介绍
19.4.5 无内容传输编码
19.4.6 传输编码介绍
19.4.7 MHTML 和行长限制
19.5 附加功能
19.5.1 内容处置
19.6 与以前版本的兼容性
19.6.1 从 HTTP/1.0 的变化
19.6.2 与 HTTP/1.0 持久连接的兼容性
19.6.3 对 RFC 2068 的更改
20 指数
21 完整的版权声明
超文本传输协议 (HTTP) 是分布式、协作、超媒体信息系统的应用层协议。自 1990 年以来,万维网全球信息倡议一直在使用 HTTP。HTTP 的第一个版本,称为 HTTP/0.9,是一种用于通过 Internet 传输原始数据的简单协议。 RFC 1945 [6] 定义的 HTTP/1.0 通过允许消息采用类似 MIME 消息的格式来改进协议,其中包含有关传输数据的元信息和请求/响应语义上的修饰符。然而,HTTP/1.0 没有充分考虑分层代理、缓存、持久连接的需求或虚拟主机的影响。此外,自称为“HTTP/1.0”的未完全实现的应用程序激增,需要更改协议版本,以便两个通信应用程序确定彼此的真实能力。
该规范定义了称为“HTTP/1.1”的协议。该协议包含比 HTTP/1.0 更严格的要求,以确保其功能的可靠实现。
实用的信息系统需要比简单的检索更多的功能,包括搜索、前端更新和注释。 HTTP 允许一组开放的方法和标头指示请求的目的 [47]。它建立在统一资源标识符 (URI) [3] 提供的参考规则之上,作为位置 (URL) [4] 或名称 (URN) [20],用于指示要应用方法的资源。消息以类似于多用途 Internet 邮件扩展 (MIME) [7] 定义的 Internet 邮件 [9] 使用的格式传递。
HTTP 还用作用户代理和代理/网关与其他 Internet 系统之间通信的通用协议,包括 SMTP [16]、NNTP [13]、FTP [18]、Gopher [2] 和 WAIS [10]协议。通过这种方式,HTTP 允许对来自不同应用程序的可用资源进行基本的超媒体访问。
本规范使用许多术语来指代 HTTP 通信的参与者和对象所扮演的角色。
联系connection
为通信目的在两个程序之间建立的传输层虚拟电路。
信息 message
HTTP 通信的基本单元,由与第 4 节中定义的语法匹配并通过连接传输的结构化八位字节序列组成。
请求 request
第 5 节中定义的 HTTP 请求消息。
回复response
第 6 节中定义的 HTTP 响应消息。
资源resource
可以由 URI 标识的网络数据对象或服务,如第 3.2 节中所定义。资源可能以多种表示形式(例如多种语言、数据格式、大小和分辨率)或以其他方式变化。
实体 entity
作为请求或响应的有效负载传输的信息。如第 7 节所述,实体由实体头字段形式的元信息和实体主体形式的内容组成。
表示 representation
如第 12 节所述,响应中包含的受内容协商的实体。可能存在与特定响应状态相关联的多个表示。
内容协商 content negotiation
服务请求时选择适当表示的机制,如第 12 节所述。可以协商任何响应中的实体表示(包括错误响应)。
变体 variant
在任何给定时刻,一个资源可能有一个或多个与其相关联的表示。这些表示中的每一个都称为“变体”。使用术语“变体”并不一定意味着资源受内容协商的影响。
客户 client
为发送请求而建立连接的程序。
用户代理 user agent
发起请求的客户端。这些通常是浏览器、编辑器、蜘蛛(网络遍历机器人)或其他终端用户工具。
服务器 server
一个应用程序,它接受连接以便通过发回响应来服务请求。任何给定的程序都可能既是客户端又是服务器;我们对这些术语的使用仅指程序为特定连接所执行的角色,而不是指程序的一般功能。同样,任何服务器都可以充当源服务器、代理、网关或隧道,根据每个请求的性质切换行为。
源服务器 origin server
给定资源驻留或将被创建的服务器。
代理 proxy
一种中间程序,它既充当服务器又充当客户端,以代表其他客户端发出请求。请求在内部得到服务,或者通过可能的翻译将它们传递给其他服务器。代理必须实现本规范的客户端和服务器要求。 “透明代理”是一种不会修改超出代理身份验证和识别所需的请求或响应的代理。 “非透明代理”是修改请求或响应以便为用户代理提供一些附加服务的代理,例如组注释服务、媒体类型转换、协议缩减或匿名过滤。除非明确说明透明或非透明行为,HTTP 代理要求适用于这两种类型的代理。
网关 gateway
充当其他服务器的中介的服务器。与代理不同,网关接收请求,就好像它是所请求资源的源服务器一样;请求客户端可能不知道它正在与网关通信。
隧道tunnel
充当两个连接之间的盲中继的中间