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