Nginx 防盗链配置中 none 和 blocked 的含义详解

网站运维过程中,防止静态资源被盗链是一个常见需求。通过 Web 服务器的 Referer 校验机制,可以有效避免其他站点直接引用图片、CSS、JS 等资源,从而减少带宽消耗和服务器压力。Nginx 提供的 valid_referers 指令常用于配置防盗链,其中 noneblocked 两个参数经常让人困惑。本文将结合实际配置示例,详细解释它们的作用。

一、典型防盗链配置示例

以下是一个常见的 Nginx 配置,用于防止 WordPress 本地静态资源被盗链:

location ~* \.(gif|jpg|png|css|js)$ {
    valid_referers none blocked *.example.com;
    if ($invalid_referer) {
        return 403;
    }
}

这段配置的作用是:

  1. 检查请求头中的 Referer 字段
  2. 如果 Referer 属于 *.example.com,则允许访问
  3. 如果 Referer 为空(none)或被屏蔽(blocked),也允许访问
  4. 其他来源一律返回 403

二、none 的含义

none 表示允许 Referer 为空的请求。

Referer 为空的典型场景包括:

  • 用户在浏览器地址栏直接输入图片 URL
  • 用户从书签打开静态资源链接
  • 某些浏览器或客户端默认不发送 Referer

如果不允许 none,这类访问会被直接拒绝,导致部分用户无法正常查看资源。

三、blocked 的含义

blocked 表示允许 Referer 被中间设备或浏览器“屏蔽”的情况。

当某些安全插件或浏览器隐私设置阻止发送 Referer 时,Nginx 会认为 Referer 值被隐藏,显示为 blocked。如果配置中包含了 blocked,这种请求会被放行;否则会被视为非法请求返回 403。

四、none 与 blocked 的选择

在实际运维中,是否保留 noneblocked 要根据业务需求权衡。

  1. 宽松模式

    valid_referers none blocked *.example.com;

    允许空 Referer 和被屏蔽的 Referer,兼容性最好,用户体验不会受影响,但防护效果相对较弱。

  2. 标准模式

    valid_referers none *.example.com;

    允许空 Referer,但不放行被屏蔽的情况,适合大部分网站,既兼顾用户体验,又能防止部分盗链。

  3. 严格模式

    valid_referers *.example.com;

    只允许指定域名引用,Referer 为空或被屏蔽时一律拒绝,安全性最高,但可能导致部分正常用户加载失败。

五、总结

Nginx 防盗链配置中的 noneblocked 是兼容性与安全性之间的平衡点。

  • none 解决用户直接访问或不带 Referer 的请求
  • blocked 解决被插件或安全策略屏蔽 Referer 的情况

如果目标是防止其他网站引用静态资源,推荐使用 标准模式,既能有效拦截盗链,又不会过多影响用户体验。

THE END