Nginx-防盗链

目录
显示
原理
对于一些静态资源,特别是媒体文件,我们不希望自己的文件被其他网站通过超链接直接访问到,通过nginx配置可以实现这一愿景。
点击超链接跳转时,浏览器都会为请求添加一个 referer 的请求头,值为跳转前的网站地址。通过这个请求头标识 nginx 就能知道请求是从哪里来的。据此我们设置好规则,就能阻止不符合要求的来源了。
示例
server {
listen 80;
server_name blogs.systemcaller.cloud;
location ~* \\.(js|css|png|jpg|jpeg|gif)$ {
# 防盗链
valid_referers ~.*systemcaller.cloud;
if ($invalid_referer) {
return 403;
}
# 静态缓存
expires 7d;
root /usr/share/nginx/html/wordpress_data;
}
上面的示例 valid_referers server_names ~.*systemcaller.cloud ; 是重点。
valid_referers 是 nginx 的关键字表示对 referer 请求头进行判断,判断时我写了一个正则表达式 ~.*systemcaller.cloud ,他的意思是来源中包含 systemcaller.cloud 的就认为合法,否则不合法。
再下面的 if 判断 $invalid_referer 在合法时值为0,不合法时为 1 , 为1 就会直接返回403错误码。也可以根据需要路由到一个自定义页面,友好的显示。
扩展
valid_referers 详细的语法规则
valid_referers | none | blocked | server_names | 正则表达式;
- none: 请求头中不存在 Referer 字段(比如直接在浏览器地址栏输入 URL)。
- blocked: 请求头中存在 Referer 字段,但值不是以 "http(s)://" 开头的字符串(被防火墙或代理服务器修改删除)。
- server_names: Referer 字段包含服务器名称。
- 正则表达式必须以
~
开头,值得注意的是,正则匹配的是在“http://”或“https://”之后的内容。
可以通过 curl -e www.baidu.com -i www.test.com 来快速测试。 -e 是指定 referer 的值。
其他方式
实际上使用 referers 来进行防盗链,并不是绝对安全的,毕竟请求头还是很好伪造的。但是作为一种简单方式,还是分可取的,增加了盗链的操作难度。那么有没有其他更加安全的方式呢?
我提供几种方式,他们有点实现起来并不容易,代价很高,按需使用。
- 使用 token 对每个请求进行合法性校验
- 使用 ip 白名单来限制请求来源
- 对数据进行加密和数字签名
- 使用 CDN ,通常 CDN 提供了一些防盗链功能,开启他即可。
- 使用专门的防盗链工具