记录一下自己不太清楚的知识点
第二章 URL 与资源
URL
url 的语法 <scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
基础 URL HTML 标记<BASE>,可以设定基础 URL
URL 编码机制 urlencode 通过转义表示不安全的字符 包含一个百分号(%),后面跟着两个表示字符 ASCII 码的十六进制数
第三章 HTTP 报文
报文的组成
组成 对报文进行描述的其实航 包含属性的首部块 可选的包含数据的主题 body
一般只有 PUT 和 POST 方法包含 body
PUT 方法的语义是让服务器用请求的主体部分来创建一个由所请求的 URL 命名的新文档,如果那个 URL 已经存在的话,就用这个主题来替代它
Http 协议中的 Header 与 Body。Header 的每行最后要加\r\n。Header 与 Body 之间要用\r\n 隔开。Body 后无需加\r\n。
ACSII 码中
‘\n’ 10 换行
‘\r’ 13 回车
也可以表示为’\x0a’和’\x0d’.(16 进制)
示例:HTTP 开始部分为 header,html 部分为 body。
1 | HTTP/1.1 200 OK\r\n |
状态码
- 101 Switching Protocols
- 300 Multiple Choices 请求一个实际指向多个资源的 URL
- 301 Moved Permanently 响应的 Location 首部包含资源现在所处的 URL
- 302 Found 响应的 Location 首部的 URL 来临时定位资源 HTTP 1.0
- 303 See Other HTTP 1.1
- 307 Temporary Redirect POST 不会转为 GET
当 HTTP/1.0 客户端发起一个 POST 请求,并在响应中收到 302 重定向状态码时,它会接受 Location 首部的重定向 URL,并向那个 URL 发起一个 GET 请求(而不会像原始请求中那样发起 POST 请求)。
问题出在 HTTP/1.1。HTTP/1.1 规范使用 303 状态码来实现同样的行为(服务器发送 303 状态码来重定向客户端的 POST 请求,在它后面跟上一个 GET 请求)。
为了避开这个问题,HTTP/1.1 规范指出,对于 HTTP/1.1 客户端,用 307 状态码取代 302 状态码来进行临时重定向。这样服务器就可以将 302 状态码保留起来,为 HTTP/1.0 客户端使用了。
Keep-Alive
在 HTTP1.1 中默认开启,可以用 Connection:close 关闭,在 HTTP1.0 默认关闭,通过 Connection:keep-alive 开启
哑代理问题,所谓哑代理,是不会处理 Keep-Alive 连接,而是直接将其转发的代理。
在网景的变通做法是,浏览器会向代理发送非标准的 Proxy-Connection 扩展首部,而不是官方支持的著名的 Connection 首部。如果代理是盲中继,它会将无意义的 Proxy-Connection 首部转发给 Web 服务器,服务器会忽略此首部,不会带
来任何问题。但如果代理是个聪明的代理(能够理解持久连接的握手动作),就用一个 Connection 首部取代无意义的 Proxy-Connection 首部,然后将其发送给服务器,以收到预期的效果。
HTTP1.1 会使用管道优化,将一连串请求放入管道中,但是对于 POST 这个样非幂等的请求不应该放在管道中
代理和网关的区别
严格来说,代理连接的是两个或多个使用相同协议的应用程序,而网关连接的则是两个或多个使用不同协议的端点。网关扮演的是“协议转换器”的角色,即使客户端和服务器使用的是不同的协议,客户端也可以通过它完成与服务器之间的事务处理。
缓存
缓存有两种,强缓存和协商缓存
强缓存使用 Expired 和 Cache Control 字段,不需要向服务器通信
协商缓存需要携带协商字段与服务器通信,如果服务器返回 304 NOT Modified 信息,就使用缓存中的资源,并在相应中插入新鲜度信息
no-store 不缓存
no-cache 在与服务器进行新鲜度验证前不使用缓存
代理缓存
为什么要有代理缓存
对于源服务器,它是有缓存的,如 Redis,Memcache。但对于 HTTP 缓存来说,如果每次客户端缓存失效都从源服务器获取,那么给源服务器的压力是很大的。
由此引入了缓存代理机制,让代理服务器接管一部分的服务端 HTTP 缓存。客户端缓存过期后就近到代理服务器缓存中获取,代理缓存过期了才请求源服务器。
缓存代理的控制分为两部分,一部分是源服务器的控制,一部分是客户端的控制。
源服务器的缓存控制
private 和 public
在源服务器的响应头中,会加上 Cache-Control 字段进行缓存的控制,它的值中可以加入 private 或 public 表示是否允许代理服务器缓存。public 表示允许。
proxy-revalidate
must-revalidate 的意思是客户端缓存过期就去源服务器获取,而proxy-revalidate表示代理服务器的缓存过期后到源服务器获取
前者使用范围主体更广,后者不应用于用户代理的本地缓存,应用在缓存服务器上
s-maxage
s 是 share 的意思,限定了缓存在代理服务器中可以存放多久,和限制客户端缓存时间的 max-age 并不冲突
客户端的缓存控制
客户端宽容设置
在客户端的请求中,可以加入这两个字段,来对代理服务器上的缓存进行宽容和限制操作
1 | max-stale:5 |
表示客户端到代理服务器上拿缓存的时候,只要过期时间在 5s 之内,依然可以从代理中获取
1 | min-fresh:5 |
表示客户端到代理服务器上拿缓存的时候,一定要在过期前 5s 之前的时间内
only-if-cached
表示客户端只会接受代理缓存,而不会接受源服务器的响应,如果代理缓存无效,则直接返回 504
安全
CSRF Cross Site Request Forgery
点击劫持 设置 X-FRAME-OPTIONS
cookie
cookie 的域名属性
1 | Set-cookie: user="mary17"; domain="airtravelbargains.com" |
将 cookie user=”mary17” 发送给域 “.airtravelbargains.com” 中的所有站点:
cookie 的路径属性
cookie 规范允许用户将 cookie 与部分 Web 站点关联起来
1 | Set-cookie: pref=compact; domain="airtravelbargains.com"; path=/autos/ |
如果用户访问 http://www.airtravelbargains.com/specials.html,就只会获得这个 cookie:
Cookie: user=”mary17”
但 如 果 访 问 http://www.airtravelbargains.com/autos/cheapo/index.html, 就会获得这两个 cookie:
Cookie: user=”mary17”
Cookie: pref=compact
Cache-Control:no-cache=” Set-Cookie” 除了 cookie 以外是可以缓存的
附录
HTTP 首部参考
- Accept
1 | Accept */* 表示所有类型 |
- Age HTTP/1.1 缓存必须在发送的每条响应中都包含一个 Age 首部