Nginx防盗链

Nginx 防盗链配置:通过 Referer 验证保护资源

防盗链是防止其他网站非法引用本网站资源(如图片、视频、CSS)的技术手段,Nginx 通过valid_referers指令检查请求的Referer头,识别非法来源并拒绝访问,从而节省带宽、保护知识产权。本文详细讲解 Nginx 防盗链的配置方法、参数含义及实战案例。

防盗链原理:基于 Referer 头验证

  • Referer 头:客户端请求资源时,HTTP 协议会在请求头中包含Referer字段,记录请求的来源页面 URL(如https://example.com/page.html引用了https://yourdomain.com/image.jpg,则Refererhttps://example.com/page.html)。
  • 防盗链逻辑:Nginx 通过valid_referers定义 “合法来源”,若请求的Referer不在合法列表中,则判定为盗链,返回 403 Forbidden。

基础配置示例

server {
    listen 80;
    server_name yourdomain.com;
    root /var/www;

    # 对图片、视频等静态资源启用防盗链
    location ~* \.(jpg|jpeg|png|gif|mp4|css|js)$ {
        # 定义合法的Referer来源
        valid_referers 
            none  # 允许无Referer的请求(如直接在浏览器输入URL访问)
            blocked  # 允许Referer被防火墙或代理隐藏的请求
            server_names  # 允许来自本域名的请求(yourdomain.com及其子域名)
            *.yourdomain.com  # 允许指定域名及其子域名
            *.trusted-site.com;  # 允许信任的第三方网站

        # 若Referer不合法,则返回403
        if ($invalid_referer) {
            return 403;
            # 可选:返回自定义图片(如“盗链必究”提示图)
            # rewrite ^/ /forbidden.png last;
        }
    }
}

valid_referers参数详解

valid_referers用于定义 “合法来源”,支持多种格式:

参数 含义
none 允许无Referer头的请求(如直接访问资源 URL)
blocked 允许Referer头被防火墙或代理移除的请求(Referer值不以http://https://开头)
server_names 允许来自当前虚拟主机server_name的请求(如yourdomain.com
*.example.com 允许指定域名及其子域名(如a.example.comb.example.com
example.com/page.html 允许来自特定页面的请求(精确匹配)

高级配置:灵活控制防盗链规则

1. 仅允许本站引用,禁止外部访问

location ~* \.(jpg|png|gif)$ {
    # 仅允许无Referer(直接访问)或本站域名的请求
    valid_referers none server_names;
    if ($invalid_referer) {
        return 403;
    }
}

2. 对不同资源设置不同规则

# 图片严格防盗链(仅允许本站)
location ~* \.(jpg|png)$ {
    valid_referers none server_names;
    if ($invalid_referer) { return 403; }
}

# CSS/JS允许信任的网站引用
location ~* \.(css|js)$ {
    valid_referers none server_names *.trusted-site.com;
    if ($invalid_referer) { return 403; }
}

3. 盗链时返回自定义提示图

location ~* \.(jpg|png)$ {
    valid_referers server_names;
    if ($invalid_referer) {
        # 盗链时返回自定义图片(需提前准备/var/www/forbidden.png)
        rewrite ^/ /forbidden.png last;
    }
}

# 确保自定义图片本身不被防盗链限制
location = /forbidden.png {
    # 关闭防盗链检查
    valid_referers any;
}

注意事项与局限性

  1. Referer头可伪造
    Referer是客户端发送的请求头,可被恶意修改,因此防盗链仅能阻止普通盗链,无法应对专业攻击(需结合签名 URL 等更安全的方案)。
  2. 允许直接访问
    若需允许用户直接在浏览器输入 URL 访问资源(如https://yourdomain.com/image.jpg),需包含valid_referers none,否则会被误判为盗链。
  3. HTTPS 与 HTTP 的 Referer 差异
    从 HTTPS 页面引用 HTTP 资源时,部分浏览器会不发送Referer头(出于安全限制),需添加valid_referers blocked允许此类请求。
  4. 性能影响
    valid_referers匹配基于字符串比对,对性能影响极小,可放心在高并发场景使用。

验证防盗链效果

  1. 合法来源测试
    valid_referers允许的域名页面中引用资源,应能正常加载。
  2. 盗链测试
    在其他域名的页面中引用资源,应返回 403 或自定义提示图。
  3. 直接访问测试
    浏览器直接输入资源 URL(无Referer),若配置了valid_referers none,应能正常加载。