实现防盗链
1. 盗链是什么?
此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容。 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比如一些音乐、图片、软件的下载地址)然后放置在自己的网站中,通过这种方法盗取大网站的空间和流量。
2. 实现防盗链/防盗链
要实现防盗链,我们就必须先理解盗链的实现原理,提到防盗链的实现原理就不得不从HTTP协议说起,在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件。换句话说,通过referer,网站可以检测目标网页访问的来源网页,如果是资源文件,则可以跟踪到显示它的网页地址。有了referer跟踪来源,就可以通过技术手段来进行处理,一旦检测到来源不是本站即进行阻止或者返回指定的页面。
referer就是之前的那个网站域名,正常的referer信息有以下几种
none:请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息。
blocked:请求报文有referer首部,但无有效值,比如为空。
server_names:referer首部中包含本主机名及即nginx 监听的server_name。
arbitrary_string:自定义指定字符串,但可使用*作通配符。
regular expression:被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.daming\.com。
基于访问安全考虑,nginx支持通ungx_http_referer_module模块检查访问请求的referer信息是否有效实现防盗链功能
- 参看官方文档https://nginx.org/en/docs/http/ngx_http_referer_module.html#valid_referers
[root@s2 ~]# vim /apps/nginx/conf/conf.d/pc.conf
location /images {
root /data/nginx/html/pc;
index index.html;
valid_referers none blocked server_names
*.example.com example.* www.example.org/galleries/
~\.google\.;
if ($invalid_referer) {
return 403;
}
# 定义防盗链
location ^~ /images {
root /data/nginx;
index index.html;
valid_referers none blocked server_names *.magedu.com www.magedu.*
api.online.test/v1/hostlist ~\.google\. ~\.baidu\.; #定义有效的referer
if ($invalid_referer) { #假如是使用其他的无效的referer访问:
return 403; #返回状态码403
}
}
#重启Nginx并访问测试