浏览器缓存、Referer防盗链

浏览器缓存

把已请求并返回的WEB资源(HTML页面、图片、js文件、CSS文件、数据等)复制成一个副本存储在浏览器的缓存中。

1. 缓存的好处

1. 减少网络带宽的消耗
2. 降低服务器压力
3. 减少网络延迟

2. Pragma:no-cache(响应头)

指示浏览器忽略资源缓存副本,每次访问需要到服务器获取。

Pargma是http1.0中的字段,http1.1用Cache-Control替代(http协议向下兼容的,所以很多网站仍然使用这个字段)。如果两个字段同时存在,Cache-Control的优先级比较高。

3. Cache-Control 缓存控制(响应头)

no-cache:指示浏览器忽略资源缓存版本,强制到服务器获取资源(浏览器依然缓存)

no-store:强制缓存在任何情况下都不要保留任何副本

max-age=31536000:指示缓存副本的有效时长,从请求时间开始到过去时间之间的秒数

public:表明响应可以被任何对象(发送请求的客户端,代理服务器等)缓存

private:表明响应只能被单个用户缓存,不能作为共享缓存(不能被代理服务器缓存)

4. Expires: Mon, 15 Aug 2020 03:56:47 GMT(Cache-Control更高)

启用缓存和定义缓存时间。告诉浏览器资源缓存过期时间,如果还没过该时间点则不发请求,在http1.1版开始,使用Cache-Control:max-age=秒替代。

5. 浏览器请求机制

cache.png

ETag优先级高于LastModified,先验证ETag,一致的情况下才验证Last-Modified。

图片资源一般都有设置过期时间,如果没有过期,直接到缓存里面取(from memory cache)。一般资源存放在disk cache或者memory cache。图片资源一般放在memory cahche中,视频、JS文件等一般放在disk cache中。

CONNECTION: KEEP-ALIVE

HTTP短连接与长连接

短连接:所谓短链接,就是每次请求一个资源就建立连接,请求完成后连接立马关闭。

创建TCP连接 - 请求资源 - 响应资源 - 断开连接

长连接:所谓长连接,就是只建立一次连接,多次资源请求都复用该连接,完成后关闭。

注意

早期HTTP/1.0:每个HTTP请求都要创建一个TCP/IP连接,属于串行连接(短链接)。
后期HTTP/1.0:请求头增加Connection:keep-alive。
HTTP/1.1:默认开启Connection:keep-alive,如需要关闭,可以使用Connection:colse。

管道化持久化连接是在长连接的基础上,进一步进行优化。

CONNECT-LENGTH

Content-Length用于描述HTTP消息实体的传输长度。

GET请求:请求头没有content-length,响应头带content-length;
POST请求:请求头和响应头都带content-length。

以POST请求为例:

username: yueluo
password: 123456

FormData: username=yueluo&password=123456(消息实体长度)

REFERER

Referer:Referer其实是错误的单词拼写,应该是referrer,现在将错就错。

Referer是request header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器是从哪个页面链接过来的。

例如:在谷歌浏览器搜索腾讯课堂,进入连接后,可以查看请求头中有Referer:https://www.google.com/。

referer.png

好处:可通过Referer分析不同渠道的流量分布、用户搜索的关键词。但是只能做大致分析,不能做精确分析。

设置Referer

不发送Referer信息

<meta name="referrer" content="no-referrer" />

Referrer Policy: no-referrer。请求头就没有referer字段。

只发送Referer:origin信息

<meta name="referrer" content="origin" />

Referrer Policy: origin 请求头只有源信息。

Referer: http://localhost/

发送Referer信息

 Referrer Policy: no-referrer-when-downgrade

仅当协议降级(如https页面引入HTTP资源)时不发送Referrer信息。大部分浏览器的默认策略。即从HTTPS页面跳转到HTTP页面,包括HTTPS获取HTTP资源,不发送Referrer。

Referer: http://localhost/network

Referer的应用场景

资源防盗链:服务器拉取资源之前判断referer是否是自己的域名或者IP,如果不是就拦截,如果是才可以拉取资源。

例如七牛CDN域名防盗链。避免违规下载图片和视频等资源。

防盗链是针对视频之类的比较敏感的资源,我们要进行防盗链处理。当然,百分之百防盗链是不可能的,但是我们可以通过一些机制来进行防盗链处理,比如说referer防盗链。我们可以在服务器获取资源之前,让服务器判断referer是不是可以信赖的来源域名,如果不是,将拦截此次请求,如果是,返回对应资源。比如在七牛服务器上,每一个资源都可以绑定一个防盗链的白名单和黑名单,如果是白名单内部的域名,就返回资源。

一般来说,常用资源防盗链有两种,一种是Referer防盗链,另一种是防盗链技术,时间戳防盗链。

时间戳防盗链

通过时间戳和签名规则来生成一段密钥,密钥是跟在资源请求地址后面,把这个密钥和资源一起发给服务器,服务器来鉴别如果签名正确,检查资源有没有过期,没有过期,返回对应资源。