Discuz附件防盗链设置,防止图片被盗用
当你的Discuz论坛图片被其他网站直接引用时,服务器流量会白白消耗,页面加载也会变慢。
防盗链的核心原理是检查HTTP请求头中的Referer字段,只允许来自你自己站点的请求访问附件。
通过配置Nginx或Apache的.htaccess规则,就能有效阻止大部分盗链行为。
准备工作:确认环境和附件路径
在动手之前,先确认你的服务器环境。
如果是宝塔面板,打开“网站”->“设置”->“配置文件”,就能看到Nginx配置。
Discuz的附件默认存放在data/attachment目录下,但如果你修改过存储位置,需要根据实际情况调整。
检查当前是否已有防盗链规则:
nginx -T | grep -i referer
如果没有任何输出,说明还没配置。
同时,确认你的站点域名,例如www.example.com,待会要加入白名单。
配置Nginx防盗链(推荐方式)
在Discuz站点的Nginx配置文件中,找到server块,在location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$之前或内部添加以下规则:
location ~* \.(gif|jpg|jpeg|png|bmp|webp)$ {
valid_referers none blocked server_names *.example.com example.com;
if ($invalid_referer) {
return 403;
}
expires 30d;
access_log off;
}
关键点说明:
valid_referers定义允许的来源:none表示直接访问(如浏览器输入图片地址),blocked表示Referer被防火墙隐藏,server_names表示本机域名,*.example.com和example.com替换为你的实际域名。if ($invalid_referer) { return 403; }表示不合法来源返回403错误。expires 30d设置浏览器缓存,减少重复请求。
保存后重载Nginx:
nginx -t && nginx -s reload
如果使用宝塔面板,可直接在“配置文件”中修改,然后点击“保存”并重载。
Apache环境下的.htaccess配置
如果你用的是Apache,在Discuz根目录的.htaccess文件中加入:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?example\.com [NC]
RewriteRule \.(gif|jpg|jpeg|png|bmp|webp)$ - [F,NC]
将example.com换成你的域名。[F]表示返回403禁止访问。
避坑指南:常见错误和注意事项
- 白名单遗漏子域名:如果论坛有多个子域名(如
bbs.example.com),务必全部加入valid_referers,否则正常访问也会被拦截。 - CDN或代理干扰:如果使用了CDN,请求的Referer可能被修改。建议在CDN端也配置Referer白名单,或暂时关闭CDN测试。
- 测试时不要直接刷新:浏览器可能缓存了旧规则,用无痕窗口或
curl命令验证。 - 防盗链影响搜索引擎:百度、Google等搜索引擎的Referer通常是空的或被隐藏,
none和blocked已覆盖,但建议观察收录情况,如有异常可临时放宽。 - 不要用301跳转替代403:跳转到首页会浪费流量,直接返回403更高效。
验证防盗链是否生效
在本地终端执行以下命令,模拟从其他站点引用图片:
curl -I -e "http://www.other.com/" http://你的域名/data/attachment/forum/202501/01/test.jpg
如果返回HTTP/1.1 403 Forbidden,说明防盗链生效。
再测试正常访问:
curl -I -e "http://你的域名/" http://你的域名/data/attachment/forum/202501/01/test.jpg
应该返回200 OK。
同时,用浏览器直接打开图片地址,应该能正常显示。
常见疑问
防盗链后,论坛会员上传的图片会受影响吗?
不会。
会员在论坛内浏览时,Referer是论坛自身域名,已在白名单中。
只有外部网站盗用才会被拦截。
为什么有的图片还是被盗用?
可能是对方使用了图片代理服务,或者你的白名单过于宽松(如允许了*)。
检查valid_referers是否误加了通配符。
开启防盗链后,百度图片搜索不显示缩略图?
百度图片搜索的Referer可能为空或被隐藏,已包含在none blocked中。
如果仍不显示,可临时将baidu.com加入白名单,但不建议长期开启。
如何只针对大尺寸图片防盗链?
可以结合文件大小或路径判断,但Nginx原生不支持直接判断文件大小。
建议对特定目录(如data/attachment/forum)单独配置防盗链。
按照以上步骤配置后,你的Discuz附件防盗链就能有效阻止大部分盗链行为,节省服务器流量。
如果遇到规则冲突,优先检查Nginx错误日志/var/log/nginx/error.log,根据报错调整白名单。