您现在的位置:新疆网站建设-新疆网站制作-新疆二域设计>> 帮助中心>常见问题>> Nginx、Apache和IIS的防盗链设置

Nginx、Apache和IIS的防盗链设置

作者:管理员  来源:互联网  发布时间:2025-09-18 09:58:14  点击数:0

盗链是指自己网站的图片和视频等资源,被其他网站引用,可能会导致自己网站的流量异常过高。本文讲述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>


关键字: 防盗链 Nginx Apache IIS

上一篇:mysql8.0的数据库导入到mysql5.7
下一篇:IIS下强制https访问的设置

版权所有 新疆二域信息技术有限公司 All Rights Reserved 地址:乌鲁木齐市北京南路高新街217号盈科广场B座615 备案号:新ICP备14003571号-6 新公网安备 65010402000050号