防盗链
什么是盗链
盗链是指服务提供商自己不提供服务的内容,通过技术手段绕过其它有利益的最终用户界面(如广告),直接在自己的网站上向最终用户提供其它服务提供商的服务内容,骗取最终用户的浏览和点击率。受益者不提供资源或提供很少的资源,而真正的服务提供商却得不到任何的收益。
nginx防盗链配置
基本使用
为了模拟盗链,在这里让101为服务站点,102为网关服务器,103访问102进行盗链。
102的nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| http { server { listen 80; server_name localhost;
location / { proxy_pass http://192.168.8.101:8080; } location ^~/images/ { root /www/resources; } } }
|
103的nginx.cfg
1 2 3 4 5 6 7 8 9 10 11 12
| http {
server { listen 80; server_name localhost;
location / { proxy_pass http: }
} }
|
访问http://192.168.8.103/:

如果不想被盗链,可以对网关服务器102做如下配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| http {
server { listen 80; server_name localhost;
location / { proxy_pass http://192.168.8.101:8080; } location ^~/images/ { valid_referers 192.168.8.102; if ($invalid_referer) { return 403; } root /www/resources; }
} }
|


valid_referers解释
可以同时携带多个参数,表示多个 referer 头部都生效。
参数值
- none:允许没有 referer 信息的请求访问,即直接通过url访问。
- blocked:请求头Referer字段不为空(即存在Referer),但是值可以为空(值被代理或者防火墙删除了),并且允许refer不以“http://”或“https://”开头,通俗点说就是允许“http://”或"https//"以外的请求。
- server_names:若 referer 中站点域名与 server_name 中本机域名某个匹配,则允许该请求访问
- 其他字符串类型:检测referer与字符串是否匹配,如果匹配则允许访问,可以采用通配符*
- 正则表达式:若 referer 的值匹配上了正则,就允许访问
invalid_referer 变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| server { server_name referer.test.com; listen 80;
error_log logs/myerror.log debug; root html; location / { valid_referers none server_names *.test.com www.test.org.cn/nginx/; if ($invalid_referer) { return 403; } return 200 'valid\n'; } }
|
配置错误提示页面
返回错误页面
在102nginx的html目录中添加403.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Error</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>An error occurred.</h1> <p>非法请求.</p>
</body> </html>
|
修改nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| http { server { listen 80; server_name localhost;
location / { proxy_pass http://192.168.8.101:8080; } location ^~/images/ { valid_referers 192.168.8.102 baidu.com; if ($invalid_referer) { return 403; } root /www/resources; }
error_page 403 /403.html; location = /403.html { root html; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; }
}
}
|
访问http://192.168.8.103/images/bg.jpg

返回出错图片
修改网关服务器102


访问192.168.8.103:

动静分离和URLRewrite