HTTP 1.0
在HTTP1.0中,可以在服务端设置 Expires
的HTTP头来告诉客户端在多久之后重新请求服务,可以通过 if-modified-since
的条件请求来使用缓存,其中发送时间是文件最初被下载的时间,而不是过期时间。如果文件没有改变,服务器可以响应 304-Not Modified
表示文件未改变,客户端可以继续使用缓存的文件。
HTTP1.0中服务器在返回时,可以通过在响应头中添加 Last-Modified
的方式表示资源上一次更改时间。请求时传递的if-modified-since
值就是Last-Modified
的值。但是这个时间仅仅只能代表编辑时间,如果文件内容没有变化,一样会修改这个时间,所以再次请求还是会重新加载资源,而不会使用缓存。
HTTP 1.1
引入了文件标签 e-tag
,e-tag 是文件或对象的唯一标识,也就是一个MD5值,e-tag
通过Response Heasers 返回。e-tag
在使用时会结合 If-None-Match
搭配使用,当缓存过期时,浏览器会在请求头中设置 If-None-Match
,值服务端返回的e-tag值(MD5),当文件未发生变化时,MD5值是不变的,此时服务端可以响应 304 状态码,浏览器继续使用本地缓存,如果返回200,则服务器返回新的文件和新的 e-tag
值。
HTTP1.1中还增加了新的缓存控制参数,就是Cache-Control
,在浏览器请求服务器资源时设置。如下就是Cache-Control
的使用案例,表示这个Response缓存时间是0,也就是说每次请求都会重新获取资源,不会使用缓存。
cache-control: max-age=0
Cache-Control 的优先级高于 Expires ,当同时设置时,使用 Cache-Control 的设置来判断。cache-control可以设置的参数有多个,而且请求头和响应头的可选参数是不一样的。
请求头中Cache-Control可选参数
字段名字 | 参数 | 说明 |
---|---|---|
no-cache | 无 | 告知(代理)服务器不使用缓存,强制向服务器发起请求 |
no-store | 无 | 不缓存请求或相应的任何内容 |
max-age=seconds | 必须,单位:秒 | 告知服务器客户端希望接收一个存在时间不大于(seconds)的资源 |
max-stale(=seconds) | 可省略,单位:秒 | 告知服务器愿意接收一个超过缓存时间的资源,如果有指定seconds,则值为seconds,没有指定则表示任意超出时间 |
min-refresh=seconds | 必须,单位,秒 | 告知服务器希望接收一个在小于seconds秒内被更新过的资源 |
no-transform | 无 | 告知服务器客户端希望获取实体数据没有被转换的资源(比如不被压缩) |
only-if-cached | 无 | 告知服务器客户端希望获取缓存的内容,如果存在缓存,则不用向源服务器发去请求 |
cache-extension | - | 自定义扩展值,若服务器不识别该值将被忽略掉 |
响应头中Cache-Control可选参数
字段名字 | 说明 | |
---|---|---|
public | 无 | 表明任何情况下都得缓存该资源(即使是需要HTTP认证的资源) |
private[=“filed-name”] | 可省略 | 表明赶回报文中全部或部分(若指定了filed-name则为filed-name的字段数据) 仅开放给某些用户(服务器指定的share-user,如代理服务器)做缓存使用, 其他用户则不能缓存这些数据 |
no-cache | 可省略 | 不直接使用缓存,要向服务器确认有效性 |
no-store | 无 | 不缓存请求或响应的任何内容 |
no-transform | 无 | 代理不可更改媒体类型 |
must-revalidate | 无 | 当前资源一定是向源服务器发起请求验证有效性的,若请求失败返回504 |
proxy-revalidate | 无 | 要求代理缓存服务器对缓存有效性进行再次确认 |
max-age=seconds | 必须,单位:秒 | 告知客户端该资源的有效时间 |
s-maxage=seconds | 必须,单位:秒 | 公共缓存服务器相应的最大age值 |
cache-extension | - | 自定义扩展值,如果浏览器不识别该值将被忽略 |
需要注意的是以上这些参数都是需要使用HTTP1.1及以上才有用的,其中no-store的优先级最高。
常见的HTTP状态码
内容源自菜鸟教程,个人整理所需,无意侵权,源地址:
https://www.runoob.com/http/http-status-codes.html
状态码 | 英文名称 | 描述 |
---|---|---|
200 | OK | 请求成功。一般用于GET与POST请求 |
202 | Accepted | 已接受。已经接受请求,但未处理完成 |
203 | Non-Authoritative Information | 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 |
205 | Reset Content | 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 |
304 | Not Modified | 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 |
305 | Use Proxy | 用代理。所请求的资源必须通过代理访问 |
400 | Bad Request | 客户端请求的语法错误,服务器无法理解 |
401 | Unauthorized | 请求要求用户的身份认证 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
405 | Method Not Allowed | 客户端请求中的方法被禁止 |
406 | Not Acceptable | 服务器无法根据客户端请求的内容特性完成请求 |
408 | Request Time-out | 服务器等待客户端发送的请求时间过长,超时 |
500 | Internal Server Error | 服务器内部错误,无法完成请求 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 |
504 | Gateway Time-out | 充当网关或代理的服务器,未及时从远端服务器获取请求 |
参考内容:
上野宣《图解HTTP》
https://blog.csdn.net/u012375924/article/details/82806617
https://www.jianshu.com/p/cd9f28d35727
https://www.runoob.com/http/http-status-codes.html