浏览器缓存和数据压缩
# HTTP缓冲机制
# 缓冲分类
缓冲分类 | 原理 | 优缺点 |
---|---|---|
本地缓冲 200 from cache | 直接从本地缓冲中获取响应,最快速最省流量,因为根本没有向服务器发送请求 | 本地读取,快速响应,不需要请求服务器 |
协商缓冲 304 Not Modified | 浏览器在本地没有命中的情况下,请求头发送一定校验数据到服务端,如果服务端没有改变,浏览器从本地响应返回304 | 快速,数据量很小,只发送基本的响应头信息,不发送响应体 |
200 | 没有使用到缓冲,直接请求服务器 | 正常请求服务器 |
# 相关Header
Header | 说明 |
---|---|
Pragma | 设置为no-cache表示禁用本地缓冲 |
Expires | Http1.0时代用来启用本地缓冲的字段,expires值对应一个格林威治时间,告诉浏览器缓存失效的时刻,如果没到这个时刻,表示缓存有效 |
Cache-Control | HTTP1.1 针对Expires时间不一致的解决方案运用cache-Control告知浏览器缓冲过期的时间间隔而不是时刻,即使具体时间不一致,也不影响缓冲的管理 |
Last-Modified | 通知浏览器资源最后的修改时间,可以用在服务端进行header返回 |
HTTP_IF_MODIFIED_SINCE | 客户端在请求时,自动携带Last-Modified头部信息 |
ETag | 文件的指纹标识符,如果文件内容修改,指纹会改变 |
if-None-Match | 本地缓冲失效,会携带此值去请求服务端,服务端判断该资源是否改变,如果没有改变,则直接使用本地缓冲,返回304 |
Cache-Control:HTTP1.1 针对Expires时间不一致的解决方案运用cache-Control告知浏览器缓冲过期的时间间隔而不是时刻,即使具体时间不一致,也不影响缓冲的管理
- no-store 禁止浏览器缓冲响应
- no-cache 不使用本地缓冲,先发起和服务器协商
- max-age = delta-seconds:告诉浏览器本地缓冲有效的最长期限,以秒为单位
以下是对header相关的使用,会根据header的有效期响应内容
$since = $_SERVER['HTTP_IF_MODIFIED_SINCE'];
$lifetime = 3600;
if(strtotime($since)+$lifetime > time()) {
header('HTTP1.1 304 Not Modified');
exit;
}
header('last-Modified:',gmdate('D,d M T H:i:s', time()),'GMT');
echo "contents";
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 缓冲策略的选择
适合缓冲的内容 eg:经常不改变的文件
- 不变的图像、如logo、图标等
- js、css静态文件
- 可下载的文件、媒体文件
适合协商缓冲 eg:经常改变的文件
- HTML文件
- 经常替换的图片
- 经常修改的js、css文件
不适合做缓冲
- 用户隐私等敏感数据
- 经常改变的api数据接口
# Nginx配置缓冲策略
参数 | 说明 |
---|---|
add_header | 添加状态码为2xx和3xx的响应头信息 add_header name value [always] |
expires | 通知浏览器过期时长 |
# 本地缓冲配置
location ~ .*\.(jpg|jpeg|gif|png|js|css)$
{
// 缓冲30天
expires 30d;
// 相当于cache-control设置为十年
expires max;
add_header cache-control max-age=3600;
}
location ~ .*\.(js|css)$
{
// 缓冲12h
expires 12h;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 协商缓冲设置
location ~ .*\.(js|css)$
{
// 缓冲12h
etag on;
}
1
2
3
4
5
2
3
4
5
# 前端代码和资源的压缩
让资源文件缩小,加快文件在网络中的传输,让网页更快的展示,降低网络带宽和流量消耗 ,通常压缩的内容包括:Js、Css、图片、Html代码的压缩
# JavasScript代码的压缩
去掉多余的空格和回车,替换长变量名,简化一些代码写法
常用压缩工具: UglifyJS、YUICompressor、Closure、Compiler
# Css代码的压缩
去掉空白符等,跟压缩js代码差不多
常用压缩工具: Css Compressor
# Html代码压缩
不建议使用代码压缩,有时会破坏代码结构,可以使用Gzip压缩,当然也可以使用htmlcompressor工具,不过转换后检查下代码结构
# 图片的压缩
压缩工具:tinypng、JpegMini、ImageOptim
上次更新: 2020/12/31, 06:55:18