月底一看流量报表,消耗翻倍,查访问日志发现一堆陌生域名在直接引用你站上的图。别人家的页面加载你付钱买的带宽,这买卖不能做。防盗链Nginx原生支持,就是referer模块。
原理一句话:浏览器请求图片时会带上Referer头标明来路,不是你允许的来路就直接拒掉或换图。核心就三行。
location ~* \.(jpg|jpeg|png|gif|webp|mp4)$ {
valid_referers none blocked server_names
*.yoursite.com yoursites-cdn.com;
if ($invalid_referer) {
return 403; # 也可以 return 302 到一张提示图
}
}
none表示空Referer放行——用户直接在地址栏敲图片URL、部分邮件客户端都不带Referer,一刀切拦掉会误伤真人。blocked是Referer被代理或防火墙抹掉的情况,也建议放行。真正的目标只有那些站外页面。
微信、QQ、微博这些平台的抓图请求Referer各不相同,如果你希望图片能在社交分享卡片里显示,把对应域名加进valid_referers列表。改完nginx -t测试、nginx -s reload生效,然后用一个在线防盗链检测工具或在自己另一个域名挂个img标签试试,403就是生效了。
顺带说一句: Referer是可以伪造的,防得住君子防不住定向爬虫。真要保护付费内容,走签名URL(secure_link模块)或者直接挪到对象存储的私有桶。对绝大多数个人站长,referer这套已经能省下可观的带宽钱。
数据来源:nginx.org官方文档 ngx_http_referer_module 模块说明
A5创业网 版权所有