Nginx 防盗链
防盗链基于客户端携带的referer实现, referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名
正常通过搜索引擎搜索web 网站并访问该网站的referer信息如下:
实现盗链
在一个web 站点盗链另一个站点的资源信息,比如:图片,视频等
主机www.meng.org,盗取m.meng.org的图片
盗链服务器配置如下:
server {
listen 80;
server_name www.meng.org;
root /data/nginx/html/pc;
access_log /apps/nginx/logs/www.meng.org_access.log main;
#加这行,要在主配置文件把log_format的注释去掉
}
nginx -s reload
盗链web页面
mkdir /data/nginx/html/pc/beijing
vim /data/nginx/html/pc/beijing/beijing.html
<html>
<head>
<meta http-equiv=Content-Type content="text/html;charset=utf-8">
<title>盗链</title>
</head>
<body>
<img src="http://m.meng.org/images/logo.jpg" >
<h1 style="color:red">欢迎大家</h1>
<p><a href=http://www.meng.org>北京</a>欢迎您</p>
</body>
</heml>
ls /data/nginx/html/mobile/images 在m.meng.org的页面仓库中创建一个目录用于装被盗链的内容
logo.jpg 图片名称对应盗链web页面的配置名称
在浏览器中对盗链内容进行查询
http://www.meng.org/beijing/beijing.html
盗链成功
修改m网站的配置文件,打开访问日志
server {
listen 80;
server_name m.meng.org;
root /data/nginx/html/mobile/;
access_log /apps/nginx/logs/m.meng.org_access.log main;
nginx -s reload
访问http://www.meng.org/beijing/beijing.html
查看日志[root@ubunt logs]# tail -f m.meng.org_access.log
10.0.0.1 - - [20/Sep/2022:20:29:50 +0800] "GET /images/logo.jpg HTTP/1.1" 304 0 "http://www.meng.org/beijing/beijing.html" "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko" "-"
可以看到http://www.meng.org/beijing/beijing.html盗m.meng.org资源。
实现防盗链
基于访问安全考虑,nginx支持通过ngx_http_referer_module模块,检查访问请求的referer信息是否有效实现防盗链功能
官方文档
https://nginx.org/en/docs/http/ngx_http_referer_module.html
语法:
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息.
blocked:#请求报文有referer首部,但无有效值,比如为空.
server_names:#referer首部中包含本主机名及即nginx 监听的server_name.
arbitrary_string:#自定义指定字符串,但可使用*作通配符.示例: *.wang.org www.magedu.*
regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如: ~.*\.baidu\.com
范例:实现防盗链,在被盗链的服务器上配置
[root@ubunt logs]# vim /apps/nginx/conf/conf.d/m.meng.org.conf
server {
listen 80;
server_name m.meng.org;
root /data/nginx/html/mobile/;
access_log /apps/nginx/logs/m.meng.org_access.log main;
location /images {
valid_referers none blocked server_names ~\.google\. ~\.baidu\.; 定义有效的
if ($invalid_referer) { 假如是使用其他的无效的referer访问
return 403; 返回403,拒绝访问
}
}
}
再次访问,返回403