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访问的设置