5.8 第五步——构建响应
一旦 Web 服务器识别出了资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体。3.4 节详细介绍了 HTTP 响应代码。
5.8.1 响应实体
如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。如果有响应主体的话,响应报文中通常包括:
描述了响应主体 MIME 类型的 Content-Type 首部;
描述了响应主体长度的 Content-Length 首部;
实际报文的主体内容。
5.8.2 MIME类型
Web 服务器要负责确定响应主体的 MIME 类型。有很多配置服务器的方法可以将 MIME 类型与资源关联起来。
MIME 类型(mime.types)
Web 服务器可以用文件的扩展名来说明 MIME 类型。Web 服务器会为每个资源扫描一个包含了所有扩展名的 MIME 类型的文件,以确定其 MIME 类型。这种基于扩展名的类型相关是最常见的,参见图 5-12。

图 5-12 Web 服务器用 MIME 类型文件来设置资源输出的 Content-type 首部
魔法分类(Magic typing)
Apache Web 服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的 MIME 类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名的时候。
显式分类(Explicit typing)
可以对 Web 服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个 MIME 类型。
类型协商
有些 Web 服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置 Web 服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的 MIME 类型)“最好”。这个问题将在第 17 章讨论。
还可以通过配置 Web 服务器,将特定的文件与 MIME 类型相关联。
5.8.3 重定向
Web 服务器有时会返回重定向响应而不是成功的报文。 Web 服务器可以将浏览器重定向到其他地方来执行请求。重定向响应由返回码 3XX 说明。Location 响应首部包含了内容的新地址或优选地址的 URI。重定向可用于下列情况。
永久搬离的资源
资源可能已经被移动到了新的位置,或者被重新命名,有了一个新的 URL。Web 服务器可以告诉客户端资源已经被重命名了,这样客户端就可以在从新地址获取资源之前,更新书签之类的信息了。状态码 301 Moved Permanently 就用于此类重定向。
临时搬离的资源
如果资源被临时移走或重命名了,服务器可能希望将客户端重定向到新的位置上去。但由于重命名是临时的,所以服务器希望客户端将来还可以回头去使用老的 URL,不要对书签进行更新。状态码 303 See Other 以及状态码 307 Temporary Redirect 就用于此类重定向。
URL 增强
服务器通常用重定向来重写 URL,往往用于嵌入上下文。当请求到达时,服务器会生成一个新的包含了嵌入式状态信息的 URL,并将用户重定向到这个新的 URL 上去。1 客户端会跟随这个重定向信息,重新发起请求,但这次的请求会包含完整的、经过状态增强的 URL。这是在事务间维护状态的一种有效方式。状态码 303 See Other 和 307 Temporary Redirect 用于此类重定向。
1有时会将这些经过扩展和状态增强的 URL 称为“胖 URL”。
负载均衡
如果一个超载的服务器收到一条请求,服务器可以将客户端重定向到一个负载不太重的服务器上去。状态码 303 See Other 和 307 Temporary Redirect 可用于此类重定向。
服务器关联
Web 服务器上可能会有某些用户的本地信息;服务器可以将客户端重定向到包含了那个客户端信息的服务器上去。状态码 303 See Other 和 307 Temporary Redirect 可用于此类重定向。
规范目录名称
客户端请求的 URI 是一个不带尾部斜线的目录名时,大多数 Web 服务器都会将客户端重定向到一个加了斜线的 URI 上,这样相对链接就可以正常工作了。

