Nginx、Apache和IIS的防盗链设置
盗链是指自己网站的图片和视频等资源,被其他网站引用,可能会导致自己网站的流量异常过高。本文讲述Nginx、Apache和IIS的防盗链设置,用以下措施可以防止盗链问题。在防盗链情况下,直接发自己网站的图片或视频链接给客户,客户是无法直接访问的,
只有正常访问网站才能显示相关图片和视频。请结合自己的业务需求使用。
Nginx 防盗链设置
Nginx 设置防盗链(Hotlink Protection)是一个非常常见且有用的功能,它可以防止其他网站直接链接到你的图片、视频、CSS、JS 等静态资源,从而盗用你的服务器带宽和流量。
Nginx 主要通过内置的 ngx_http_referer_module 模块来实现防盗链功能,其核心原理是检查 HTTP 请求头中的 Referer 字段。
以下是一些常见的配置场景,你通常需要在 server 或 location 块中添加这些配置。
Nginx 防盗链场景一:基本防盗链(保护所有图片格式),这个配置只允许来自你自己域名和空 Referer 的请求访问图片。
server {
listen 80;
server_name yourdomain.com;
# 图片缓存设置
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
# 定义有效的Referer来源
valid_referers none blocked yourdomain.com *.yourdomain.com;
# 如果Referer不在有效列表里,$invalid_referer为1,则执行后面的操作
if ($invalid_referer) {
# 可以返回403错误
return 403;
# 或者重写为一个防盗链提示图片
# rewrite ^ /path/to/anti-hotlink-image.jpg;
}
# 正常情况下的设置,如设置缓存时间、过期头等
expires 30d;
add_header Cache-Control "public";
}
}Nginx 防盗链场景二:更灵活的设置(允许特定合作伙伴)
如果你希望允许一些友好的网站或搜索引擎(如 Google、Baidu)引用你的图片,可以添加他们的域名。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
valid_referers none blocked
yourdomain.com *.yourdomain.com
google.com *.google.com
baidu.com *.baidu.com;
if ($invalid_referer) {
return 403;
}
# ... 其他配置 ...
}Nginx 防盗链场景三:使用正则表达式匹配更复杂的域名
对于更复杂的匹配需求,可以使用正则表达式(以 ~ 开头)。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
# 使用正则匹配所有以 "yourdomain.com" 结尾的域名
valid_referers none blocked
~\.yourdomain\.com$
~\.google\.;
if ($invalid_referer) {
return 403;
}
# ... 其他配置 ...
}Nginx 防盗链场景四:返回一张防盗链提示图片
与其返回冷冰冰的 403 错误,不如重写请求,返回一张有趣的“请勿盗链”提示图片,体验更好。
location ~* \.(jpg|jpeg|png|gif|webp|bmp)$ {
valid_referers none blocked yourdomain.com *.yourdomain.com;
if ($invalid_referer) {
# 将所有盗链请求重写到一个本地图片
rewrite ^ /images/anti-hotlink.jpg;
break; # 重要:使用break防止重写规则被再次处理
}
# ... 其他配置 ...
}
# 单独为这个提示图片设置一个location,避免它自己也被防盗链规则拦截
location = /images/anti-hotlink.jpg {
expires 0; # 不缓存,每次都重新请求
add_header Cache-Control "no-cache";
# 确保这个图片路径确实存在
}Nginx 防盗链更安全的方案:使用 Secure Link 模块 (可选)
Referer 检查的方式非常方便,但可以被伪造。对于安全性要求极高的场景,Nginx 提供了更强大的 ngx_http_secure_link_module 模块。
这种方式会为每个资源链接生成一个带过期时间和哈希校验令牌的URL。如果令牌无效或链接已过期,访问将被拒绝。
location /downloads/ {
# 从URL中获取secure_link和expires参数
secure_link $arg_md5,$arg_expires;
# 设置生成令牌时使用的密钥,必须与生成链接的程序使用的密钥一致
secure_link_md5 "your_secret_key$secure_link_expires$uri";
# 如果令牌无效
if ($secure_link = "") {
return 403; # 令牌错误或缺失
}
# 如果令牌有效但链接已过期
if ($secure_link = "0") {
return 410; # Gone,表示资源已过期
}
# ... 正常服务资源 ...
}这种方式需要你在程序端(如 PHP、Python、Node.js)动态生成带令牌的链接,配置相对复杂,但安全性极高。
配置完成后,一定要用 nginx -t 测试配置语法是否正确,然后用 nginx -s reload 重载配置。
测试方法:
在你自己的网站页面里查看图片,应该正常显示。
直接在浏览器地址栏输入图片链接,应该正常显示(因为 Referer 为空,none 允许)。
使用 curl 命令模拟盗链:curl -e "http://illegal-site.com" http://yourdomain.com/your-image.jpg,应该返回 403 或你设置的提示图片。
允许空 Referer:none 选项很重要。如果不加 none,用户直接输入链接、从邮件或即时通讯工具点击链接时,Referer 也为空,也会被拦截,影响正常用户体验。
性能:正则表达式虽然强大,但比普通字符串匹配更耗性能,请谨慎使用。
Apache防盗链设置
规则文件.htaccess(手工创建.htaccess文件到站点根目录)
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteCond %{HTTP_REFERER} !google.com [NC]
RewriteCond %{HTTP_REFERER} !xxx.net [NC]
#RewriteCond %{HTTP_REFERER} ^$ [NC]
RewriteRule .*\.(jpg|jpeg|png|gif|bmp|swf|mp4|zip|rar|pdf|webp|js|css)$ /band.txt [NC,L]
</IfModule>注:xxx.net是您自己的域名,band.txt是被盗链后的提示内容文件
IIS防盗链设置
Windows2008、2012或更高系统下规则文件web.config (手工创建web.config文件到站点根目录)
<?xml version="1.0" ?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="rule1" stopProcessing="true">
<match url="^.*\.(jpg|jpeg|png|gif|bmp|swf|mp4|zip|rar|pdf|webp|js|css)$" ignoreCase="true" />
<conditions logicalGrouping="MatchAny" >
<add input="{HTTP_REFERER}" pattern="您的域名.com(不用加www)" negate="true" />
<!--<add input="{HTTP_REFERER}" pattern="^$" />-->
</conditions>
<action type="AbortRequest" />
</rule>
</rules>
</rewrite>
</system.webServer>
</configuration>上一篇:mysql8.0的数据库导入到mysql5.7
下一篇:IIS下强制https访问的设置
