十一 nginx 防盗链问题
两个网站 A 和 B, A网站引用了B网站上的图片,这种行为就叫做盗链。 防盗链,就是要防止A引用B的图片。
1、nginx 防止网站资源被盗用模块
ngx_http_referer_module
如何区分哪些是不正常的用户?
HTTP Referer是Header的一部分,当浏览器向Web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器借此可以获得一些信息用于处理,例如防止未经允许的网站盗链图片、文件等。 因此HTTP Referer头信息是可以通过程序来伪装生成的,所以通过Referer信息防盗链并非100%可靠,但是,它能够限制大部分的盗链情况.
比如在www.google.com 里有一个www.baidu.com
链接,那么点击这个www.baidu.com
,它的header
信息里就有:Referer=http://www.google.com
2、防盗链配置
配置要点:
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
# 日志格式添加"$http_referer"
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# valid_referers 使用方式
Syntax: valid_referers none | blocked | server_names | string ...;
Default: —
Context: server, location
-
none : 允许没有http_refer的请求访问资源;
-
blocked : 允许不是http://开头的,不带协议的请求访问资源;
-
server_names : 只允许指定ip/域名来的请求访问资源(白名单);
准备两台机器,两张图片(缓存问题)
配置nginx配置文件,并上传图片 [root@nginx-server html]# vim /etc/nginx/conf.d/nginx.conf server { listen 80; server_name localhost; location / { root /usr/share/nginx/html; index index.html index.htm; valid_referers none blocked *.qf.com 10.0.105.202; if ($invalid_referer) { return 502; } } location ~ .*\.(gif|jpg|png|jpeg)$ { root /usr/share/nginx/html; valid_referers qf.com 10.0.105.202; if ($invalid_referer) { return 403; } } } 重载nginx服务 [root@nginx-server ~]# nginx -s reload -c /etc/nginx/nginx.conf
第二台机器客户端 配置nginx访问页面 创建页面 [root@nginx-server nginx]# vim index.html <html> <head> <meta charset="utf-8"> <title>qf.com</title> </head> <body style="background-color:red;"> <img src="http://10.0.105.202/test.jpg"/> </body> </html> 测试不带http_refer: [root@nginx-server nginx]# curl -I "http://10.0.105.202/test1.png" HTTP/1.1 200 OK Server: nginx/1.16.0 Date: Thu, 27 Jun 2019 16:21:13 GMT Content-Type: image/png Content-Length: 235283 Last-Modified: Thu, 27 Jun 2019 11:27:11 GMT Connection: keep-alive ETag: "5d14a80f-39713" Accept-Ranges: bytes 测试带非法http_refer: [root@nginx-server nginx]# curl -e http://www.baidu.com -I "http://10.0.105.202/test.jpg" HTTP/1.1 403 Forbidden Server: nginx/1.16.0 Date: Thu, 27 Jun 2019 16:22:32 GMT Content-Type: text/html Content-Length: 153 Connection: keep-alive 测试带合法的http_refer: [root@nginx-server nginx]# curl -e http://10.0.105.202 -I "http://10.0.105.202/test.jpg" HTTP/1.1 200 OK Server: nginx/1.16.0 Date: Thu, 27 Jun 2019 16:23:21 GMT Content-Type: image/jpeg Content-Length: 27961 Last-Modified: Thu, 27 Jun 2019 12:28:51 GMT Connection: keep-alive ETag: "5d14b683-6d39" Accept-Ranges: bytes
3、其他配置
3.1、匹配域名
# location ~ .*\.(gif|jpg|png|jpeg)$ {
# root /usr/share/nginx/html;
# valid_referers none blocked qf.com 10.0.105.202;
# if ($invalid_referer) {
# return 403;
# }
# }
location ~ .*\.(gif|jpg|png|jpeg)$ {
root /usr/share/nginx/html;
valid_referers 10.0.105.202 *.baidu.com *.google.com;
if ($invalid_referer) {
rewrite ^/ http://10.0.105.202/test.jpg;
#return 403;
}
}
以上所有来自 qf.com 和域名中google和baidu的站点都可以访问到当前站点的图片,如果来源域名不在这个列表中,那么$invalid_referer等于1,在if语句中返回一个403给用户,这样用户便会看到一个403的页面,如果使用下面的rewrite,那么盗链的图片都会显示403.jpg。如果用户直接在浏览器输入你的图片地址,那么图片显示正常,因为它符合none这个规则。
标签:10.0,http,nginx,root,server,NGINX,com,防盗链 From: https://blog.csdn.net/bozuris/article/details/139825525