nginx 防盗链配置
背景:防止第三方引用链接访问我们的图片,消耗服务器资源和网络流量,我们可以在服务器上做防盗链限制。
实现防盗链的方式有两种:refer方式和签名方式。
refer方式实现防盗链
工作模块:ngx_http_referer_module。
作用变量:$invalid_referer,全局变量。
配置域:server, location
配置:
server {
listen 80;
server_name www.imcati.com refer-test.imcati.com;
root /usr/share/nginx/html;
location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
valid_referers none blocked www.imcati.com;
if ($invalid_referer) {
return 403;
}
}
}
valid_referers: 指定资源访问是通过以下几种方式为合法,即白名单。
none:允许缺失的头部访问。
blocked:允许referer没有对应值的请求。
server_names:若referer站点域名与server_name中本机配的域名一样允许访问。
访问refer-test.imcati.com/index.html测试:
index.html
<!DOCTYPE html> <html> <head> <title>test</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <p>image address:<a href="http://www.imcati.com/test.jpg">image</a></p> </body> </html>
点击图片地址:
可以把none去掉,防止别人通过右键另存图片地址,当然别人也可以通过伪造refer来进行访问。
那么如何从根本上解决防盗链问题呢?
我们可以通过签名方式实现。
签名方式实现防盗链
工作模块:第三方模块HttpAccessKeyModule。
配置:
server {
listen 80;
server_name www.imcati.com refer-test.imcati.com;
root /usr/share/nginx/html;
location ~*\.(gif|jpg|jpeg|png|bmp|swf)$ {
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "mypass$remote_addr";
}
}
}
accesskey on | off: 模块开关
accesskey_hashmethod md5|sha—1: 签名加密方式
accesskey_arg: GET参数名称
accesskey_sign: 加密规则
$sign = md5('mypass' . $_SERVICE['REMOTE_ADDR']);
//img src=/test.png?key=<?=$sign?>
扩展:
secure_link 实现文件防盗链
工作模块:http_secure_link_module 模块。
配置段:location。
配置:
server {
listen 80;
server_name www.imcati.com;
root /usr/share/nginx/html;
location ~* \.(rar|zip|7z|tar)?$ {
#这里配置了2个参数一个是st,一个是e
secure_link $arg_st,$arg_e;
#st的哈希格式为自定义秘钥+url+e,e为时间戳单位s,url为请求地址
secure_link_md5 key$uri$arg_e;
if ( $secure_link = "" ) {
#资源不存在或哈希比对失败
return 403;
}
if ( $secure_link = "0" ) {
#时间戳过期
return 403;
}
}
}
secure_link : secure_link md5_hash [,expiration_time]
secure_link_md5 : secure_link_md5 secret_token_concatenated_with_protected_uri
Java生成防盗链地址(使用Apache commons-codec jar包)
注意:进行md5运算时,视频名字前加斜杆 如:/link.zip
public static void main(String[] args) {
String time = String.valueOf(System.currentTimeMillis() / 1000 + Long.valueOf(600));// +600代表600秒后地址失效
String md5 = Base64.encodeBase64URLSafeString(DigestUtils.md5("key" + "/link.zip" + time));
return "http://127.0.0.1/link.zip?st=" + md5 + "?e=" + time;
}
最终请求url:http://127.0.0.1/link.zip?st=xxxxxxx?e=xxxxxx
赠人玫瑰,手有余香,如果我的文章有幸能够帮到你,麻烦帮忙点下右下角的推荐,谢谢!
作者: imcati
出处: https://www.cnblogs.com/imcati/>
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现