第 4 章 返回结果的 HTTP 状态码
4.1 状态码告知从服务器端返回的请求结果
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。
数字中的第一位定义了响应类别,后两位无分类。响应类别有以下 5 种:
类别 | 原因短语 |
| — | — | — |
| 1XX | Informational(信息性状态码) | 接收的请求正在处理 |
| 2XX | Success(成功状态码) | 请求正常处理完毕 |
| 3XX | Redirection(重定向状态码) | 需求进行附加操作以完成请求 |
| 4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
| 5XX | Server Error(服务器错误状态码) | 服务器处理请求出错 |
只要遵守状态码类别的定义,即使改变 RFC2616 中定义的状态码,或服务器端自行创建状态码都没问题。
2XX 成功
200 OK:表示从客户端发来的请求在服务器端被正常处理了
204 No Content:请求处理成功,但是没有资源返回
206 Partial Content:请求处理成功,返回部分内容,响应报文中包含 Content-Range 指定范围的实体内容
3XX 重定向
301 Moved Permanently:永久性重定向
302 Found:临时性重定向
303 See Other:表示请求的资源存在着另一个 URL,应使用 GET 方法定向获取请求的资源
304 Not Modified:表示请求的资源没有改变,可以使用客户端上未过期的资源
307 Temporary Redirect:临时性重定向,不会从 POST 变成 GET
4XX 客户端错误
400 Bad Request:表示请求报文中存在语法错误
401 Unauthorized:表示发送的请求需要有通过 HTTP 认证
403 Forbidden:表示请求资源的访问被服务器拒绝了
404 Not Found:表示服务器上没有请求的资源
5XX 服务器错误
500 Internal Server Error:表示服务器在执行请求时发生了错误
503 Service Unavailable:表示服务器暂时处于超负载或者正在进行停机维护,现在无法处理请求
第 5 章 与 HTTP 协作的 Web 服务器
5.1 用单台虚拟主机实现多个域名
HTTP / 1.1 规范允许一台 HTTP 服务器搭建多个 Web 站点。这是利用虚拟主机(Virtual Host,又称虚拟服务器)的功能。
在互联网上,域名通过 DNS 服务映射到 IP 地址之后访问目标网站。可见,当请求发送到服务器时,已经是以 IP 地址形式访问了。所以,当一台托管了两个域名的服务器接收到请求时就需要弄清楚究竟要访问哪个域名。
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。
5.2 通信数据转发程序:代理、网关、隧道
5.2.1 代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
每次通过代理服务器转发请求或响应式,会追加写入via首部信息。
使用代理服务器的理由有:利用缓存技术(稍后讲解)减少网络带宽的流量,组织内部针对特定网站的访问控制,以获取访问日志为主要目的,等等。
代理有多种使用方法,按两种基准分类。一种是是否使用缓存,另一种是是否会修改报文:
- 缓存代理:代理转发响应时,缓存代理会预先将资源的副本(缓存)保存在代理服务器上
- 透明代理:转发请求或响应时,不对报文做任何加工的代理类型被称为透明代理。反之,对 报文内容进行加工的代理被成为非透明代理
5.2.2 网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
网关的工作机制和代理十分相似。而网关能使通信线路上的服务器提供非 HTTP 协议服务。
5.2.3 隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
隧道本身不会去解析 HTTP 请求。请求保持原样中转给之后的服务器。隧道会在通信双方断开连接时结束。
5.3 保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,节省通信流量和时间。
缓存服务器是代理服务器的一种。当代理转发从服务器返回的响应时,代理服务器将会保存一份资源的副本。
缓存服务器的优势在于利用缓存可避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了。
5.3.1 缓存的有效期限
对于缓存服务器和客户端浏览器,当判定缓存过期或客户端要求,会向源服务器确认资源的有效性。若失效,浏览器会再次请求新资源。
5.3.2 客户端的缓存
缓存不仅可以存在于缓存服务器内,还可以存在客户端浏览器中。以 Internet Explorer 程序为例,把客户端缓存称为临时网络文件(Temporary Internet File)。
第 6 章 HTTP 首部
6.1 HTTP 首部字段
6.1.1 HTTP 首部字段传递重要信息
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
6.1.2 4 种 HTTP 首部字段类型
- 通用首部字段(General Header Fields)
- 请求首部字段(Request Header Fields)
- 响应首部字段(Response Header Fields)
- 实体首部字段(Entity Header Fields)
6.1.3 HTTP / 1.1 首部字段一览
通用首部字段
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
- Cache-Control 的 no-cache 指令代表不缓存过期的资源,而不是不缓存。no-store 才是真正不进行缓存。
- Connection 首部字段的值为 close 时,代表服务器想明确断开连接(HTTP / 1.1默认都是持久连接)
请求首部字段
首部字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Authorization | Web 认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮件地址 |
Host | 请求资源所在服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
If-Range | 资源未更新时发送实体 Byte 的范围请求 |
If-Unmodified-Since | 比较资源的更新时间(与 If-Modified-Since 相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认真信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中 URI 的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP 客户端程序的信息 |
- 该表的 Accept* 字段都可以指定权重 q 值(0-1)。当服务器提供多种内容时,将会首先返回权重最高的
- If-xxx 请求首部字段都称为条件请求,服务器接收到附带条件的请求后,只有判断指定条件为真时,才回执行请求
- Referer 的正确拼写应该是 Referrer。当直接在浏览器的地址栏输入 URI 时,或处于安全考虑时,可不发该首部字段
响应首部字段
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定的 URI |
Proxy-Authentication | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP 服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
几乎所有浏览器在接收到包含首部字段 Location 的响应后,都会强制性地尝试对已提示的重定向资源的访问。
实体首部字段
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的 HTTP 方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的 URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
Cookie 相关首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 服务器端返回给客户端存储的 Cookie 信息 | 响应首部字段 |
Cookie | 客户端向服务器端发送 Cookie 信息 | 请求首部字段 |
Set-Cookie 字段的属性
属性 | 说明 |
---|---|
NAME=VALUE | 赋予 Cookie 的名称和其值(必须项) |
expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=Path | 将服务器上的文件目录作为 Cookie 的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 | 作为 Cookie 适用对象的域名(若不指定则默认为创建 Cookie 的服务器的域名) |
Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
- expires:一旦 Cookie 从服务器端发送至客户端,服务器端就不存在可以显示删除 Cookie 的方法。但可通过覆盖已过期的 Cookie,实现对客户端 Cookie 的实质性删除操作
- path:用来指定 cookie 被发送到服务器的哪一个目录路径下(即被服务器哪个路径接收 cookie),其中”/“指的是站点根目录,可在同一台服务器(即使有多个应用)内共享该 cookie
其他首部字段
- X-Frame-Options
- X-XSS-Protection
- DNT
- P3P