Nginx 从入门到入坟(九)- Nginx 静态资源如何防盗链
1. 什么是资源盗链
资源盗链指的是此内容不在自己服务器上,而是通过技术手段,绕过别人的限制将别人的内容放到自己页面上最终展示给用户,以此来盗取大网站的空间和流量。简而言之就是用别人的东西成就自己的网站。
效果演示,下面是京东和百度的两张图片:
京东:https://img14.360buyimg.com/n7/jfs/t1/101062/37/2153/254169/5dcbd410E6d10ba22/4ddbd212be225fcd.jpg
百度:https://pics7.baidu.com/feed/cf1b9d16fdfaaf516f7e2011a7cda1e8f11f7a1a.jpeg?token=551979a23a0995e5e5279b8fa1a48b34&s=BD385394D2E963072FD48543030030BB
引用两张图片:
效果:
可以看出,百度的图片添加了防止盗链的功能,而京东的图片可以直接使用。
2. Nginx防盗链的实现原理
讲防盗链的原理之前,我们得先了解一个 HTTP 的头信息 Referer,当浏览器向 Web 服务器发送请求的时候,一般都会带上 Referer,来告诉浏览器该网页是从哪个页面链接过来的。
后台服务器可以根据获取到的这个 Referer 信息来判断是否为自己信任的网站地址,如果是则放行继续访问,如果不是则可以返回 403(服务端拒绝访问)的状态信息。
Nginx 防盗链的具体实现:
valid_referers: Nginx 会通就过查看 referer 自动和 valid_referers 后面的内容进行匹配,如果匹配到了就将$invalid_referer
变量置 0,如果没有匹配到,则将$invalid_referer
变量置为 1,匹配的过程中不区分大小写。
语法 | valid_referers none|blocked|server_names|string… |
---|---|
默认值 | - |
位置 | server、location |
- none:如果 Header 中的 Referer 为空,允许访问;
- blocked:在 Header 中的 Referer 不为空,但是该值被防火墙或代理进行伪装过,如不带
http://
、https://
等协议头的资源允许访问; - server_names:指定具体的域名或者 IP;
- string:可以支持正则表达式和*的字符串。如果是正则表达式,需要以
~
开头表示,例如:
1 | location ~*\.(png|jpg|gif){ |
那么现在问题来了,图片有很多,该如何批量进行防盗链?
3. 针对目录进行防盗链
配置如下:
1 | location /images { |
这样我们可以对一个目录下的所有资源进行翻到了操作。
还有一个问题:Referer 的限制比较粗,比如随意加一个 Referer,上面的方式是无法进行限制的。那么这个问题改如何解决?
此处我们需要用到 Nginx 的第三方模块ngx_http_accesskey_module
,第三方模块如何实现盗链,如何在 Nginx 中使用第三方模块的功能,这些我们在后面的 Nginx 的模块篇再进行详细的讲解。