HTTP学习笔记#2
五、与HTTP协作的web服务器
- HTTP/1.1 规范允许一台HTTP服务器搭建多个web站点,即在相同IP地址下,由于虚拟主机可以寄存多个不同主机名和域名的网站。因此发送HTTP请求时,必须在Host首部内完整指定主机名或域名的URI
- 通信数据转发程序:
- 代理:一种有转发功能的应用程序,扮演着服务器与客户端的“中间人”。
- 基本行为:不改变请求URI,直接转发。
- 转发时,需要附加Via首部字段以标记出经过的主机信息。
- 代理按两种基准分类。一种:是否使用缓存,另一种:是否修改报文。(缓存代理、透明代理)
- 缓存代理:代理转发时,缓存代理会预先将资源缓存在代理服务器上。
- 透明代理:转发请求或响应式,不对报文做任何加工的代理。反之,称为非透明代理。
- 网关:转发其他服务器通信数据的服务器。接收从客户端发来的请求时,它就像自己拥有资源的原服务器一样对请求进行处理
- 工作机制与代理相似,区别在于:网关能使通信线路上的服务器提供非HTTP协议服务
- 利用网关提高通信的安全性,因为可以在客户端与网关之间的通信新路上加密以确保连接的安全。
- 隧道:可按要求建立起一条与其他服务器的通信线路,届时使用SSL等加密手段进行通信。
- 目的是确保客户端能与服务器进行安全的通信。
- 隧道本身不会去解析HTTP请求。
六、HTTP首部
- 请求报文首部
- 请求行(方法、URI、HTTP版本)
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其他
- 响应报文首部
- 状态行(HTTP版本、状态码)
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其他
- 首部字段结构
- 字段名和字段值构成,中间用冒号
Content-Type: text/html
- 字段值对应单个HTTP首部字段可以有多个值
Keep-Alive: timeout=15, max=100
- End-to-end 首部和Hop-by-hop 首部
-
端到端首部(End-to-end Header)
分在此类别中的首部回转发给请求/响应对应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须转发。 -
逐跳首部(Hop-by-hop Header)
分在此类别的首部支队单词转发有效,会因通过缓存活代理而不再转发。HTTP/1.1和之后版本汇总,如果要使用hop-by-hop首部,需提供Connection首部字段。 - 除了以下字段都属于端到端首部:
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade
- HTTP/1.1通用首部字段
Cache-Control:操作缓存的工作机制
- 表示是否缓存的指令
-
public
:明确表明其他用户也可利用缓存。 -
private
:缓存服务器会对该特定用户提供资源缓存的服务,而其他用户发送过来的请求不会返回缓存,与public相反。 -
no-cache
:为了防止从缓存中返回过期的资源。 -
no-store
:规定缓存不能在本地存储请求或响应的任一部分。
说明:从字面上很容易把no-cache误解为不缓存,但其实no-cache代表不缓存过期的资源,缓存会向源服务器进行有效期确认后处理资源。no-store才是真正地不进行缓存。
-
- 指定缓存期限和认证的指令
-
Cache-Control: max-age=604800
,如果判定缓存资源的缓存时间数值比max-age值小,客户端就接收缓存的资源。当max-age为0时,缓存服务器通常需要将请求转发给源服务器。 -
Cache-Control: s-maxage=604800
,与max-age相同,不同点时s-maxage只适用于多位用户使用的公共缓存服务器(代理)。当使用s-maxage指令后,会忽略Expires首部字段以及max-age指令处理。 -
Cache-Control: min-fresh=60
,要求缓存服务器返回至少还没过指定时间的缓存资源。 -
Cache-Control: max-stale=3600
,指缓存资源,即使过期也照常接收。 -
Cache-Control: only-if-cached
,要求缓存服务器不重新加载响应,也不会再次确认资源有效性。如果请求缓存服务器的本地缓存无响应,则返回504。 -
Cache-Control: must-revalidate
,代理会向资源服务器再次验证即将返回的响应缓存是否有效。使用该指令会忽略max-stale。 -
Cache-Control: proxy-revalidate
,缓存服务器收到请求,必须再次验证缓存有效性。 -
Cache-Control: no-transform
,缓存不能改变实体主体的媒体类型。可防止缓存或代理压缩图片等类似操作。
-
Connection
-
控制不再转发给代理的首部字段
Connection: 不在转发的首部字段名
-
管理持久连接
Connection: close
,当服务端明确断开连接是,则指定Connection首部字段的值为Close。
Connection: Keep-Alive
,HTTP/1.1默认连接为持久连接。
Data:表示创建HTTP报文的日期和时间,时间格式:Date: Tue, 03 Jul 2012 04:40:59 GMT
Pragma:HTTP/1.1之前版本的历史遗留字段,Pragma: no-cache
。类似Cache-Control: no-cache
Trailer:说明:Trailer会事先说明报文主体后记录了哪些首部字段。该首部字段可应用在HTTP/1.1版本分块传输编码时。
Transfer-Encoding
- 规定了传输报文主体时采用的编码方式。
- HTTP/1.1的传输编码方式仅对分块传输编码有效。
Upgrade
- 用于检测HTTP协议及其他协议是否可使用更高的版本进行通讯,其参数值可以用来制定一个完全不同的通信协议。
- 使用首部字段Upgrade时,还需额外制定
Connection: Upgrade
Via
- 报文经过代理或网关时,会先在首部字段Via中附加该服务器的信息,然后再转发。
- Via不仅用于追踪报文的转发,还可避免请求回环的发生。
Warning
- 从HTTP/1.0的响应首部(Retry-After)演变过来,告知用户一些与缓存相关的问题和警告。
- 格式:
Warning: [警告码] [警告的主机:端口号]
"[警告内容]" ([日期时间])
110 Response is stale 代理返回已过期的资源
111 Revalidation failed 代理再验证资源有效性时失败(服务器无法到达等原因)
112 Disconnection operation 代理与互联网连接被故意切断
113 Heuristic expiration 响应的使用期超过24小时
199 Miscellaneous warning 任意的警告内容
214 Transformation applied 代理对内容编码或媒体类型等执行了某些处理时
299 Miscellaneous persistent warning 任意的警告内容
6. 请求首部字段
**Accept**
- 告诉服务器,用户代理能够处理的媒体类型及媒体类型的相对优先级。
- 可使用`type/subtype`这种形式,一次指定多种媒体类型。q代表权重,范围是0~1
`Accept: text/html,application/Xhtml+xml,application/xml;q=0.9,*/*;q=0.8`
**Accept-Charset**:用来通知服务器用户代理支持的**字符集及字符集的相对优先级**
**Accept-Encoding**
- 用来告知服务器用户代理支持的**内容编码及内容编码的优先级顺序**
- `Accept-Encoding: gzip, deflate`
**Accept-Language**:告知服务器用户代理能够处理的**自然语言集,以及相对优先级**
**Authorization**:用来告知服务器,用户代理的认证信息。
**Except**:告知服务器,期望出现的某种特定行为。
**From**:告知服务器使用用户代理的用户的电子邮件地址。
**Host**:告知服务器请求的资源所处的互联网主机名和端口号。
**If-Match**
- 只有当If-Match的字段值根ETag值匹配一致时,服务器才会接受请求。反之,返回412状态吗
- 如果使(\*)指定If-Match的字段值,服务器将会忽略ETag,只要资源存在就处理请求。
**If-Modified-Since**:如果在If-Modified-Since字段指定的日期时间后,资源发生了更新,服务器会接受请求。
**If-None-Match**:只有在If-None-Match的字段值与ETag值不一致时,可处理请求。与If-Match首部字段的作用相反。
**If-Range**:告知服务器若指定的If-Range字段值和请求资源的ETag值或时间一致时,则作为范围请求处理。反之,则返回全体资源。
**If-Unmodified-Since**:与If-Modified-Since相反。
**Max-Forwards**:转发数,每次转发值减1.当值变0时,返回响应。
**Proxy-Authorization**
- 接收到从代理服务器发来的认证质询时,客户端会发送包含首部字段Proxy-Authorization的请求,以告知服务器认证需要的信息。
- 注意:认证行为发生在客户端与代理之间。
**Range**:返回资源的指定范围
**Referer**:告知服务器请求的原始资源的URL
**TE**:告知服务器客户端能够处理响应的传输编码方式及相对优先级,与Accept-Encoding功能相似,但是用于传输编码。
**User-Agent**,告知服务器创建请求的浏览器和用户代理名称等信息。
7. 响应首部字段
**Accept-Ranges**
- 告知客户端服务器是否能处理范围请求
- 可指定的字段值有:可处理范围请求时指定其为bytes,反之则指定其为none。
**Age**:告知客户端,源服务器在多久前创建了响应。字段值的单位为秒。
**ETag**:
- 一种可将资源以字符串形式做唯一标识的方式。
- 资源更新时,ETag需要更新。
- 强ETag值,不论实体发生多么细微的变化都会改变其值。`ETag: "usagi-1234"`
- 弱ETag值,只有资源发生了根本改变,才会改变ETag值。在字段值最开始附加W `ETag: W/"usagi-1234"`
**Location**:重定向。
**Proxy-Authenticate**:会把由代理服务器所要求的认证信息发送给客户端。
**Retry-After**:告诉客户端应该多久之后再次发送请求。
**Server**:告诉客户端服务器上安装的HTTP服务器应用程序的信息。
**Vary**:首部字段Vary可对缓存进行控制。当Vary字段值为Accept-Language,那么只有对持相同自然语言的请求返回缓存。
**WWW-Authenticate**:用于HTTP访问认证。
8. 实体首部字段
**Allow**:通知客户端能够支持Request-URI指定资源的HTTP方法。
**Content-Encoding**:
- 告知客户端服务器对实体的主体部分选用的内容编码方式。内容编码是值在不丢失实体信息的前提下所进行的压缩。
- 主要采用以下4种内容编码的方式。(gzip、compress、deflate、identity)
**Content-Language**:告知客户端,实体主体使用的自然语言。
**Content-Length**:表明实体主体部分的大小,单位是字节。
**Content-Location**:表示报文主体返回资源对应的URI。
**Content-MD5**:该字段的值是一串MD5算法生成的值,目的在于检查报文主体在传输过程中是否保持完整。
**Content-Range**:针对范围的请求,返回响应时使用的首部字段Content-Range,能告知客户端作为响应返回的实体的哪个部分符合范围请求。
**Content-Type**:说明了实体主体内对象的媒体类型。
**Expires**:告知客户端资源实效日期,实效前,响应的副本会一直被保存。
**Last-Modified**:资源最终修改的时间。
9. 为Cookie服务的首部字段
**Set-Cookie**:开始状态管理所使用的Cookie信息,响应首部字段
NAME=VALUE 赋予Cookie的名称和其值(必需项)。
expires=DATE Cookie的有效期,默认为浏览器关闭前为止。
path=PATH 将服务器上的文件目录作为Cookie的适用对象。
domain=域名 作为Cookie适用对象的域名,可设置domain用于跨域操作。
Secure 仅在HTTPS安全通信时才会发送Cookie。
HttpOnly 加以限制,使Cookie不能被JavaScript脚本访问。
**Cookie**:服务器接收到的Cookie信息,请求首部字段
Cookie: status=enable
首部字段Cookie会告知服务器,当客户端想要获得HTTP状态管理支持时,就会在请求中包含从服务器接收到的Cookie。
10. 其他首部字段
**X-Frame-Options**:用于控制网站内在其他Web网站的Frame标签内的显示问题,目的是为了防止点击劫持攻击。有两个值:**DENY**,拒绝;**SAMEORIGIN**,仅同源域名下的页面匹配时许可。
**X-XSS-Protection**:针对跨站脚本攻击的一种对策。0:将XSS过滤设置成无效状态,1:相反。
**DNT**:Do Not Track,意为拒绝个人信息被收集,是表示拒绝被精准广告追踪的一种方法。0:同意被追踪,1:拒绝被追踪。
**P3P**:通过利用P3P(The Platform for Privacy Preferences,在线隐私偏好平台)技术,可以让Web网站上的个人隐私变成一种仅供程序可理解的形式,以达到保护用户隐私的目的。