防止盗图(盗链)的核心方法
防止盗图的核心思路是:识别请求来源,只允许自己网站内的页面正常调用图片,阻止外部网站直接引用图片链接。
最常用且最有效的方法是使用 .htaccess 文件进行服务器端配置,这需要你的服务器环境是 Apache。
方法1:使用 .htaccess 防止图片盗链(推荐)
这是最经典、最有效的方法,通过检查 HTTP_REFERER(请求来源页面的地址)来判断请求是否合法。
操作步骤:
-
找到
.htaccess文件:- 通常位于你的网站根目录下(
/public_html/或/wwwroot/)。 - 如果没有,你可以新建一个文本文档,命名为
.htaccess(注意前面的点),然后上传到网站根目录。
- 通常位于你的网站根目录下(
-
编辑
.htaccess文件: 在文件中添加以下代码,请将http://www.yourdomain.com替换成你自己的网站域名。# 防止图片、视频等文件被盗链 RewriteEngine On # 定义允许的域名(多个域名用 | 隔开) RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?yourdomain.com [NC] RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?baidu.com [NC] # 可选:允许百度等搜索引擎抓取 RewriteCond %{HTTP_REFERER} !^$ # 可选:允许空referer(例如用户直接在浏览器输入图片地址访问) # 定义要保护的文件类型 RewriteRule \.(jpg|jpeg|png|gif|bmp|swf|flv|mp3|wma|wmv|svg|ico)$ - [F,NC,L]代码解释:
RewriteEngine On:开启 Apache 的重写引擎。RewriteCond:设置重写条件,可以理解为“如果满足以下条件,则执行下面的重写规则”。%{HTTP_REFERER}:获取请求来源地址。!^http(s)?://(www\.)?yourdomain.com [NC]:如果来源地址 不包含http://www.yourdomain.com或https://www.yourdomain.com(NC表示不区分大小写),则条件成立。!^$:如果来源地址为空(即用户直接在浏览器输入图片URL访问),也成立,这个选项可以根据需要决定是否加上。
RewriteRule:设置重写规则。\.(jpg|jpeg|png|gif|bmp|swf|flv|mp3|wma|wmv|svg|ico)$:匹配所有以这些后缀结尾的文件。- [F,NC,L]:- 表示不进行重写,直接执行一个操作。
[F]:Forbidden,禁止访问,服务器会返回 403 错误页面。[NC]:No Case,不区分大小写。[L]:Last,表示这是最后一条规则,匹配后不再继续匹配其他规则。
-
保存并上传: 将修改后的
.htaccess文件上传到网站根目录,覆盖原文件。
效果: 当其他网站尝试直接使用你的图片链接时,访问者看到的将是浏览器默认的 403 Forbidden 错误页面,图片无法正常显示,而你的网站内部页面调用图片则完全不受影响。
针对 Nginx 服务器的配置
如果你的服务器是 Nginx,配置方法与 Apache 不同,需要在 Nginx 的配置文件(通常是 nginx.conf 或站点配置文件)中进行设置。
# 在 server 块内添加以下配置
location ~* \.(jpg|jpeg|png|gif|bmp|swf|flv|mp3|wma|wmv|svg|ico)$ {
# 设置允许的域名,多个域名用空格隔开
valid_referers none blocked server_names
http://www.yourdomain.com
http://yourdomain.com;
# 如果来源不在允许列表中,则返回 403
if ($invalid_referer) {
return 403;
}
}
代码解释:
location ~* \.(...):匹配所有指定的文件类型, 表示不区分大小写的正则匹配。valid_referers:定义合法的来源。none:允许没有 Referer 的情况(直接访问)。blocked:允许 Referer 被防火墙或代理服务器隐藏的情况。server_names:允许访问当前服务器的域名。- 后面跟上你自己的域名。
if ($invalid_referer):如果来源不在valid_referers列表中,$invalid_referer变量将为真,则执行return 403,返回禁止访问。
织梦(DedeCMS)系统级优化
除了服务器端的硬核防御,我们还可以在织梦系统层面做一些优化,从源头上减少被盗的风险。
方法1:使用织梦自带的水印功能
这是最直接的方法,在图片上传时自动添加你的网站水印。
操作步骤:
- 登录织梦后台。
- 进入 【系统】 -> 【系统基本参数】 -> 【附件设置】。
- 找到以下几项并进行设置:
WaterMarkEnable:设置为是,开启水印功能。WaterMarkText:输入你的水印文字,如你的网站名。WaterMarkFont:选择字体,建议使用.ttf格式的字体文件,并上传到/include/fonts/目录。WaterMarkFontColor:设置水印颜色,如#FFFFFF(白色)。WaterMarkImage:可以上传一个 logo 图片作为水印。WaterMarkPos:设置水印位置,如9(随机位置)。WaterMarkTransparent:设置透明度,建议50-80,太明显影响美观,太低则容易被去除。WaterMarkMaxWidth和WaterMarkMaxHeight:设置水印最大宽高,通常设置为图片的宽高百分比,如50(表示图片宽高的50%)。
效果: 即使图片被盗取,上面也会带有你的网站标识,增加了盗图者的处理成本,并起到了品牌宣传的作用。
方法2:禁用右键和图片拖拽(前端防御)
这种方法是“障眼法”,不能从根本上防止盗图(懂技术的人可以轻易绕过),但对于普通用户和初级爬虫有一定效果。
操作步骤:
-
在织梦后台,进入 【模板】 -> 【默认模板管理】**。
-
找到你需要修改的模板文件,通常是
index.htm(首页)、article_article.htm(文章页)、list_article.htm(列表页) 等。 -
在
<head>和</head>标签之间,添加以下 JavaScript 代码:<script type="text/javascript"> // 禁用右键菜单 document.oncontextmenu = function() { return false; }; // 禁用图片拖拽 document.addEventListener('dragstart', function(e) { if (e.target.tagName === 'IMG') { e.preventDefault(); } }, false); // 禁用图片选择 document.addEventListener('selectstart', function(e) { if (e.target.tagName === 'IMG') { e.preventDefault(); } }, false); </script>
效果: 用户无法通过鼠标右键保存图片,也无法直接拖拽图片到桌面或本地,但请注意,用户仍然可以通过浏览器截图、开发者工具修改代码等方式获取图片。
综合建议与最佳实践
为了达到最佳的防盗链效果,建议采用 “组合拳” 策略:
-
基础防御(必须做):
- 使用
.htaccess(Apache) 或 Nginx 配置,这是最核心、最有效的手段,能从根源上阻止大部分盗链行为,节省服务器资源。
- 使用
-
内容加固(强烈推荐):
- 开启织梦水印功能,即使图片被盗,也能带上你的标识,起到品牌宣传和威慑作用。
-
用户体验优化(可选):
- 禁用右键和拖拽,作为辅助手段,可以增加普通用户盗图的难度。
-
内容溯源(终极手段):
- 如果你发现图片被大规模盗用,可以通过 搜索引擎图片搜索 或 以图搜图 工具找到盗图网站。
- 然后向对方的网站主机服务商(ICP备案信息里可以查到)发送侵权投诉邮件,要求对方下架内容,这是法律途径,通常对有备案的网站比较有效。
| 方法 | 层面 | 优点 | 缺点 | 推荐度 |
|---|---|---|---|---|
.htaccess / Nginx |
服务器端 | 效果最好,节省资源,一劳永逸 | 需要服务器权限,对Nginx和Apache配置不同 | ★★★★★ (必做) |
| 织梦水印 | 系统级 | 上增加盗取成本,有品牌宣传作用 | 不能阻止盗取,可能影响图片美观 | ★★★★☆ (强烈推荐) |
| 禁用右键/拖拽 | 前端 | 简单易用,对小白用户有效 | 技术人员可轻松绕过,治标不治本 | ★★☆☆☆ (辅助手段) |
对于绝大多数网站来说,使用 .htaccess 防盗链 + 开启织梦水印 是性价比最高、效果最显著的最佳组合方案。
