http状态码
-
1xx 信息响应
-
2xx 成功响应
-
3xx 重定向
- 304(Not Modified)
客户端缓存了请求的文件(Last Modified),那么在请求中会包含 If Modified Since Last Modified 。服务端判断这个时间和当前请求的文件的修改时间返回 304 or 200 。
静态文件服务器会自动完成这个过程,但是对于动态页面要做类似的缓存加速的话就得自定义这个Last Modified
静态页面的Last-Modified就是他在文件系统中的修改时间,对于动态页面,要想添加这个Last Modified一般是在你的数据库中定义,因为动态页面主要就是你的数据会发生变化,并不断渲染新的页面,客户端向服务端确认已缓存的数据是否发生了变化- flask
if_modified_since = request.headers.get("If-Modified-Since")if if_modified_since and if_modified_since == article["last_modified"]:return "", 304 # 资源未修改response = make_response(jsonify(article))response.headers["Last-Modified"] = article["last_modified"]return response
- 手动配置nginx
location /static/ {root /var/www/html;expires 30d;add_header Last-Modified $date_gmt; }
对于短时间内的相同请求要想实现缓存加速,可以将后端的响应缓存到Nginx
http {proxy_cache_path /path/to/cache levels=1:2 keys_zone=my_cache:10m inactive=60m; #反向代理缓存路径 目录层级结构 共享缓存区域名称:大小,存储缓存键(key)和元数据(如缓存有效期)缓存非活动过期时间(优先级高于proxy_cache_valid)server {location / {proxy_pass http://backend_server;proxy_cache my_cache;proxy_cache_valid 200 302 10m; # 缓存成功响应 10 分钟proxy_cache_valid 404 1m;proxy_cache_valid any 5m;add_header X-Proxy-Cache $upstream_cache_status; # 查看缓存命中状态 HIT MISS BYPASS 配置:proxy_cache_bypass $condition1 $condition2 ...; EXPIRED}} }
- 304(Not Modified)
-
4xx 客户端错误
- 405请求方法not allowed
- 403Forbidden
-
5xx 服务端错误
- 请求的url不存在
http条件请求
前置知识
-
验证器
在请求中传递的描述资源版本的值,两大类- last-modified
- etag (实体标签)
-
ETag
是服务器(Server)发送的,用于标识资源的版本或唯一标识符。
If-Match
是客户端(Client)发送的请求方式 -
条件首部
If-Match
未发生修改返回200 已修改返回412 Precondition FailedIf-None-Match
未修改 302 Not Modified 已修改200并加载修改的资源If-Unmodified-Since
If-Range
只能含有一个实体标签或者日期值。匹配失败返回200及完整的资源
那其他的头部要那么多标签干嘛?因为一次请求可以包含很多个资源呀
-
应用场景(缓存或断点续传和锁机制)
- 缓存更新
这个很简单 - 增量下载的完整性
支持增量下载的服务器会通过Accept-Ranges
首部来广播这项能力,如过下载中断了客户端就发送Ranges
首部字段及缺失的范围值进行断点续传
防止续传时文件已发生变化记得加If-Modified-Since
和If-Match
首部,也可以用If-Range
,这样只需要一次请求
注意不能用If-None-Match+Range
这种情况下,如果Etag匹配直接返回304,要是不匹配就从Range开始下载,完全颠倒 - 更新丢失
乐观锁在并发情况下只允许第一个客户端的修改提交If-Modified-Since
或If-Match
- 资源首次上传的竞态
If-None-Match:*
当且仅当资源先前并不存在的情况下请求的操作才会成功执行
- 缓存更新