5、与 HTTP 协作的 Web 服务器
一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率。
用单台虚拟主机实现多个域名
在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI。
通信数据转发程序 :代理、网关、隧道
用于通信数据转发的应用程序
代理
代理是一种有转发功能的应用程序,它扮演了位于服务器和客户端“中间人”的角色,接收由客户端发送的请求并转发给服务器,同时也接收服务器返回的响应并转发给客户端。
缓存代理
透明代理
网关
网关是转发其他服务器通信数据的服务器,接收从客户端发送来的请求时,它就像自己拥有资源的源服务器一样对请求进行处理。有时客户端可能都不会察觉,自己的通信目标是一个网关。
隧道
隧道是在相隔甚远的客户端和服务器两者之间进行中转,并保持双方通信连接的应用程序。
保存资源的缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存的有效期限
向源服务器确认资源的有效性。
客户端的缓存
当判定缓存过期后,会向源服务器确认资源的有效性。
6、HTTP 首部
HTTP 报文首部
- HTTP 请求报文
在请求中,HTTP 报文由方法、URI、HTTP 版本、HTTP 首部字段等部分构成。 - HTTP 响应报文
在响应中,HTTP 报文由 HTTP 版本、状态码(数字和原因短语)、HTTP 首部字段 3 部分构成。
HTTP 首部字段
使用首部字段是为了给浏览器和服务器提供报文主体大小、所使用的语言、认证信息等内容。
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:” 分隔。
首部字段名: 字段值(可以有多个值)
例如:Content-Type: text/html
有重复,看浏览器。有的优先处理第一次出现的首部字段,有的优先处理最后出现的。
根据实际用途被分为以下 4 种类型。HTTP/1.1 规范定义了如下 47 种首部字段。
通用首部字段(General Header Fields)
请求报文和响应报文两方都会使用的首部。
首部字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部、连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Trailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
请求首部字段(Request Header Fields)
从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、响应内容相关优先级等信息。
首部字段名 | 说明 |
---|---|
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 | 客户端程序的信息 |
响应首部字段(Response Header Fields) [页面顶部]
从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息。
首部字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围请求 |
Age | 推算资源创建经过时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向至指定URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
实体首部字段(Entity Header Fields)
针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的信息。
首部字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期时间 |
Last-Modified | 资源的最后修改日期时间 |
非 HTTP/1.1 首部字段
还有 Cookie、Set-Cookie 和 Content-Disposition等在其他 RFC 中定义的首部字段,它们的使用频率也很高。
HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。
- 端到端首部(End-to-end Header)
分在此类别中的首部会转发给请求 / 响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。 - 逐跳首部(Hop-by-hop Header)
分在此类别中的首部只对单次转发有效,会因通过缓存或代理而不再转发。HTTP/1.1 和之后版本中,如果要使用 hop-by-hop 首部,需提供 Connection 首部字段。
除这 8 个首部字段之外,其他所有字段都属于端到端首部:
Connection
Keep-Alive
Proxy-Authenticate
Proxy-Authorization
Trailer
TE
Transfer-Encoding
Upgrade
HTTP/1.1 通用首部字段
通用首部字段是指,请求报文和响应报文双方都会使用的首部。
Cache-Control
操作缓存的工作机制
Cache-Control: private, max-age=0, no-cache
缓存请求指令:
指令 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 强制向源服务器再次验证 |
no-store | 无 | 不缓存请求或响应的任何内容 |
max-age = [ 秒] | 必需 | 响应的最大Age值 |
max-stale( = [ 秒]) | 可省略 | 接收已过期的响应 |
min-fresh = [ 秒] | 必需 | 期望在指定时间内的 响应仍有效 |
no-transform | 无 | 代理不可更改媒体类型 |
only-if-cached | 无 | 从缓存获取资源 |
cache-extension | - | 新指令标记(token) |
缓存响应指令:
指令 | 参数 | 说明 |
---|---|---|
Public | 无 | 可向任意方提供响应的缓存 |
Private | 可省略 | 仅向特定用户返回响应 |
no-cache | 可省略 | 缓存前必须先确认其有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 可缓存但必须再向源服务器进行确认 |
proxy-revalidate | 无 | 要求中间缓存服务器对缓存的响应有效性再进行确认 |
max-age = [ 秒] | 必需 | 响应的最大Age值 |
s-maxage = [ 秒] | 必需 | 公共缓存服务器响应的最大Age值 |
cache-extension | - | 新指令标记(token) |
Connection
1.控制不再转发给代理的首部字段
Connection: 不再转发的首部字段名
2.管理持久连接
Connection: close # 断开连接
Connection: Keep-Alive # 维持持续连接
Date
表明创建 HTTP 报文的日期和时间
Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma
与 HTTP/1.0的向后兼容,客户端要求所有的中间服务器不返回缓存的资源。
不是所有的中间服务器都使用HTTP/1.1,因此还发送Cache-Control: no-cache。
Pragma: no-cache
Trailer
说明在报文主体后记录了哪些首部字段。该首部字段可应用在 HTTP/1.1 版本分块传输编码时。
Trailer: Expires
...(报文主体)...
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT
Transfer-Encoding
指示数据传输采用分块传输的编码方式。
Transfer-Encoding: chunked # 以不确定长度分块发送
Upgrade
用于检测 HTTP 协议及其他协议是否可使用更高的版本进行通信,其参数值可以用来指定一个完全不同的通信协议。
Upgrade 首部字段产生作用的 Upgrade 对象仅限于客户端和邻接服务器之间。因此,使用首部字段 Upgrade 时,还需要额外指定Connection:Upgrade。
Transfer-Encoding: chunked # 以不确定长度分块发送
Via
追踪客户端与服务器之间的请求和响应报文的传输路径。
报文经过代理或网关时,会先在首部字段 Via 中附加该服务器的信息,然后再进行转发。
Warning
从 HTTP/1.0 的响应首部(Retry-After)演变过来的,告知用户一些与缓存相关的问题的警告。
Warning: \[警告码]\[警告的主机:端口号]“\[警告内容]”(\[日期时间])
HTTP/1.1 警告码
警告码 | 警告内容 | 说明 |
---|---|---|
110 | Response is stale(响应已过期) | 代理返回已过期的资源 |
111 | Revalidation failed(再验证失败) | 代理再验证资源有效性时失败(服务器无法到达等原因) |
112 | Disconnection operation(断开连接操作) | 代理与互联网连接被故意切断 |
113 | Heuristic expiration(试探性过期) | 响应的使用期超过24小时(有效缓存的设定时间大于24小时的情况下) |
199 | Miscellaneous warning(杂项警告) | 任意的警告内容 |
214 | Transformation applied(使用了转换) | 代理对内容编码或媒体类型等执行了某些处理时 |
299 | Miscellaneous persistent warning(持久杂项警告) | 任意的警告内容 |
请求首部字段
从客户端往服务器端发送请求报文中所使用的字段,用于补充请求的附加信息、客户端信息、对响应内容相关的优先级等内容。
Accept
通知服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。可使用 type/subtype 这种形式,一次指定多种媒体类型。
Accept: text/html,application/xhtml+xml,application/xml;q=0.1
- 文本文件
text/html, text/plain, text/css …
application/xhtml+xml, application/xml … - 图片文件
image/jpeg, image/gif, image/png … - 视频文件
video/mpeg, video/quicktime … - 应用程序使用的二进制文件
application/octet-stream, application/zip …
若想要给显示的媒体类型增加优先级,则使用 q= 来额外表示权重值1 ,用分号(;)进行分隔。权重值 q 的范围是 0~1(可精确到小数点后 3 位),且 1 为最大值。不指定权重 q 值时,默认权重为 q=1.0。
Accept-Charset
通知服务器用户代理支持的字符集及字符集的相对优先顺序。同样可指定多种,设置权重q。
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8
Accept-Encoding
告知服务器用户代理支持的内容编码
及内容编码的优先级顺序。可一次性指定多种内容编码。
Accept-Encoding: gzip, deflate
- gzip
由文件压缩程序 gzip(GNU zip)生成的编码格式(RFC1952),采用 Lempel-Ziv 算法(LZ77)及 32 位循环冗余校验(Cyclic Redundancy Check,通称 CRC)。 - compress
由 UNIX 文件压缩程序 compress 生成的编码格式,采用 Lempel-Ziv-Welch 算法(LZW)。 - deflate
组合使用 zlib 格式(RFC1950)及由 deflate 压缩算法(RFC1951)生成的编码格式。 - identity
不执行压缩或不会变化的默认编码格式
Accept-Language
告知服务器用户代理能够处理的自然语言集(指中文或英文等),以及自然语言集的相对优先级。可一次指定多种自然语言集。
Accept-Language: zh-cn,zh;q=0.7,en-us,en;q=0.3
Authorization
告知服务器,用户代理的认证信息(证书值)。
Authorization: Basic dWVub3NlbjpwYXNzd29yZA==
Expect
客户端使用首部字段 Expect 来告知服务器,期望出现的某种特定行为。因服务器无法理解客户端的期望作出回应而发生错误时,会返回状态码 417 Expectation Failed。
主要用于客户端在发送大型请求体(例如POST请求中的大量数据)之前,先检查服务器是否愿意接受该请求。这个机制的设计目的是为了节省带宽和提高效率,避免在服务器拒绝请求的情况下,客户端白白上传大量数据。
Expect: 100-continue
From
告知服务器使用用户代理的用户的电子邮件地址。
Host
请求的资源所处的互联网主机名和端口号。Host 首部字段在 HTTP/1.1 规范内是唯一一个必须被包含在请求内的首部字段。
Host: http://www.hackr.jp
若服务器未设定主机名,那直接发送一个空值即可。Host:
If-Match
形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。
只有当 If-Match 的字段值跟 ETag 值匹配一致时,服务器才会接受请求。反之,则返回状态码 412 Precondition Failed 的响应。
还可以使用星号(*)指定 If-Match 的字段值。针对这种情况,服务器将会忽略 ETag 的值,只要资源存在就处理请求。
If-Modified-Since
用于确认代理或客户端拥有的本地资源的有效性。获取资源的更新日期时间,可通过确认首部字段 Last-Modified 来确定。
若 If-Modified-Since 字段值早于资源的更新时间,则希望能处理该请求。而在指定 If-Modified-Since 字段值的日期时间之后,如果请求的资源都没有过更新,则返回状态码 304 Not Modified 的响应。
If-Modified-Since: Thu, 15 Apr 2004 00:00:00 GMT
If-None-Match
和首部字段 If-Match作用相反。用于指定 If-None-Match 字段值的实体标记(ETag)值与请求资源的 ETag 不一致时,它就告知服务器处理该请求。If-None-Match: *
If-Range
告知服务器若指定的 If-Range 字段值(ETag 值或者时间)和请求资源的 ETag 值或时间相一致时,则作为范围请求处理。反之,则返回全体资源。
If-Unmodified-Since
和首部字段 If-Modified-Since 的作用相反。它的作用的是告知服务器,指定的请求资源只有在字段值内指定的日期时间之后,未发生更新的情况下,才能处理请求。否则返回状态码 412 Precondition Failed。
Max-Forwards
通过 TRACE 方法或 OPTIONS 方法,发送包含首部字段 Max-Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。每次转发数值减 1,当数值变 0 时返回响应。
Max-Forwards: 10
Proxy-Authorization
接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization 的请求,以告知服务器认证所需要的信息。
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
Range
告知服务器资源的指定范围。
Range: bytes=5001-10000
TE
告知服务器客户端能够处理响应的传输编码方式及相对优先级。它和首部字段 Accept-Encoding 的功能很相像,但是用于传输编码。
TE: gzip, deflate;q=0.5
User-Agent
将创建请求的浏览器和用户代理名称等信息传达给服务器。
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/201001
响应首部字段
由服务器端向客户端返回响应报文中所使用的字段,用于补充响应的附加信息、服务器信息,以及对客户端的附加要求等信息。
Accept-Ranges
告知客户端服务器是否能处理范围请求,以指定获取服务器端某个部分的资源。当不能处理范围请求时,Accept-Ranges: none
Accept-Ranges: bytes
Age
告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
Age: 600
Etag
能告知客户端实体标识。它是一种可将资源以字符串形式做唯一性标识的方式。服务器会为每份资源分配对应的 ETag值。当资源更新时,ETag 值也需要更新。资源被缓存时,就会被分配唯一性标识。
ETag: "82e22293907ce725faf67773957acd12"
强 ETag 值和弱 Tag 值
强 ETag 值,不论实体发生多么细微的变化都会改变其值。
弱 ETag 值只用于提示资源是否相同。只有资源发生了根本改变,产生差异时才会改变 ETag 值。这时,会在字段值最开始处附加 W/。
Location
Location 可以将响应接收方引导至某个与请求 URI 位置不同的资源。基本上,该字段会配合 3xx :Redirection 的响应,提供重定向的URI。
Location: http://www.usagidesign.jp/sample.html
Proxy-Authenticate
把由代理服务器所要求的认证信息发送给客户端。
Proxy-Authenticate: Basic realm="Usagidesign Auth"
Retry-After
告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable 响应,或 3xx Redirect 响应一起使用。指定为具体的日期时间(Wed, 04 Jul 2012 06:34:24GMT 等格式)
Retry-After: 120
ServerServer
Server 告知客户端当前服务器上安装的 HTTP 服务器应用程序的信息。
Server: Apache/2.2.17 (Unix)
Vary
当代理服务器接收到带有 Vary 首部字段指定获取资源的请求时,如果使用的 Accept-Language 字段的值相同,那么就直接从缓存返回响应。反之,则需要先从源服务器端获取资源后才能作为响应返回。
首部字段 Vary 可对缓存进行控制。
Vary: Accept-Language
WWW-Authenticate
用于 HTTP 访问认证。它会告知客户端适用于访问请求 URI 所指定资源的认证方案(Basic 或是 Digest)和带参数提示的质询(challenge)。状态码 401 Unauthorized 响应中,肯定带有首部字段 WWW-Authenticate。
WWW-Authenticate: Basic realm="Usagidesign Auth"
实体首部字段
实体首部字段是包含在请求报文和响应报文中的实体部分所使用的首部,用于补充内容的更新时间等与实体相关的信息。
Allow
用于通知客户端能够支持 Request-URI 指定资源的所有 HTTP 方法。当服务器接收到不支持的 HTTP 方法时,会以状态码405 Method Not Allowed 作为响应返回。
Allow: GET, HEAD
Content-Encoding
告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是指在不丢失实体信息的前提下所进行的压缩。
Content-Encoding: gzip
Content-Language
告知客户端,实体主体使用的自然语言(指中文或英文等语言)。
Content-Language: zh-CN
Content-Length
表明了实体主体部分的大小(单位是字节)。对实体主体进行内容编码传输时,不能再使用 Content-Length首部字段。
Content-Length: 15000
Content-Location
给出与报文主体部分相对应的 URI。和首部字段 Location 不同,Content-Location 表示的是报文主体返回资源对应的 URI。
Content-Location: http://www.hackr.jp/index-ja.html
Content-MD5
Content-MD5 是一串由 MD5 算法生成的值,其目的在于检查报文主体在传输过程中是否保持完整,以及确认传输到达。
客户端会对接收的报文主体执行相同的 MD5 算法,然后与首部字段 Content-MD5 的字段值比较。
Content-MD5: OGFkZDUwNGVhNGY3N2MxMDIwZmQ4NTBmY2IyTY==
Content-Range
针对范围请求,返回响应时使用的首部字段 Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。字段值以字节为单位,表示当前发送部分及整个实体大小。
Content-Range: bytes 5001-10000/10000
Content-Type
说明了实体主体内对象的媒体类型。和首部字段 Accept 一样,字段值用 type/subtype 形式赋值。
Content-Type: text/html; charset=UTF-8
Expires
Expires 会将资源失效的日期告知客户端。
Expires: Wed, 04 Jul 2012 08:26:05 GMT
Last-Modified
指明资源最终修改的时间。
Last-Modified: Wed, 23 May 2012 09:59:55 GMT
为 Cookie 服务的首部字段
Cookie 的工作机制是用户识别及状态管理。Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该Web网站时,可通过通信方式取回之前发放Cookie。
调用 Cookie 时,由于可校验 Cookie 的有效期,以及发送方的域、路径、协议等信息,所以正规发布的 Cookie 内的数据不会因来自其他Web 站点和攻击者的攻击而泄露。
Set-Cookie
当服务器准备开始管理客户端的状态时,会事先告知各种信息。响应首部字段
Set-Cookie: status=enable; expires=Tue, 05 Jul 2011 07:26:31
属性 | 说明 |
---|---|
NAME=VALUE | 赋予 Cookie 的名称和其值(必需项) |
expires=DATE | Cookie 的有效期(若不明确指定则默认为浏览器关闭前为止) |
path=PATH | 将服务器上的文件目录作为Cookie的适用对象(若不指定则默认为文档所在的文件目录) |
domain=域名 | 作为 Cookie 适用对象的域名 (若不指定则默认为创建 Cookie的服务器的域名) |
Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
Cookie
告知服务器,当客户端想获得 HTTP 状态管理支持时,就会在请求中包含从服务器接收到的 Cookie。接收到多个Cookie 时,同样可以以多个 Cookie 形式发送。
Cookie: status=enable
其他首部字段
HTTP 首部字段是可以自行扩展
X-Frame-Options
X-Frame-Options 属于 HTTP 响应首部,用于控制网站内容在其他 Web 网站的 Frame 标签内的显示问题。其主要目的是为了防止点击劫持(clickjacking)攻击。
X-Frame-Options: DENY
X-XSS-Protection
HTTP 响应首部,它是针对跨站脚本攻击(XSS)的一种对策,用于控制浏览器 XSS 防护机制的开关。
0 :将 XSS 过滤设置成无效状态
1 :将 XSS 过滤设置成有效状态
X-XSS-Protection: 1
DNT
属于 HTTP 请求首部,其中 DNT 是 Do Not Track 的简称,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。
0 :同意被追踪
1 :拒绝被追踪
DNT: 1
P3P
响应首部,通过利用 P3P(The Platform forPrivacy Preferences,在线隐私偏好平台)技术,可以让 Web 网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。
P3P: CP="CAO DSP LAW CURa ADMa DEVa TAIa PSAa PSDa IVAa IVDa OUR BUS