Nginx 防盗链配置中 none 和 blocked 的含义详解
在网站运维过程中,防止静态资源被盗链是一个常见需求。通过 Web 服务器的 Referer 校验机制,可以有效避免其他站点直接引用图片、CSS、JS 等资源,从而减少带宽消耗和服务器压力。Nginx 提供的 valid_referers
指令常用于配置防盗链,其中 none
和 blocked
两个参数经常让人困惑。本文将结合实际配置示例,详细解释它们的作用。
一、典型防盗链配置示例
以下是一个常见的 Nginx 配置,用于防止 WordPress 本地静态资源被盗链:
location ~* \.(gif|jpg|png|css|js)$ {
valid_referers none blocked *.example.com;
if ($invalid_referer) {
return 403;
}
}
这段配置的作用是:
- 检查请求头中的 Referer 字段
- 如果 Referer 属于
*.example.com
,则允许访问 - 如果 Referer 为空(none)或被屏蔽(blocked),也允许访问
- 其他来源一律返回 403
二、none 的含义
none
表示允许 Referer 为空的请求。
Referer 为空的典型场景包括:
- 用户在浏览器地址栏直接输入图片 URL
- 用户从书签打开静态资源链接
- 某些浏览器或客户端默认不发送 Referer
如果不允许 none
,这类访问会被直接拒绝,导致部分用户无法正常查看资源。
三、blocked 的含义
blocked
表示允许 Referer 被中间设备或浏览器“屏蔽”的情况。
当某些安全插件或浏览器隐私设置阻止发送 Referer 时,Nginx 会认为 Referer 值被隐藏,显示为 blocked
。如果配置中包含了 blocked
,这种请求会被放行;否则会被视为非法请求返回 403。
四、none 与 blocked 的选择
在实际运维中,是否保留 none
和 blocked
要根据业务需求权衡。
宽松模式:
valid_referers none blocked *.example.com;
允许空 Referer 和被屏蔽的 Referer,兼容性最好,用户体验不会受影响,但防护效果相对较弱。
标准模式:
valid_referers none *.example.com;
允许空 Referer,但不放行被屏蔽的情况,适合大部分网站,既兼顾用户体验,又能防止部分盗链。
严格模式:
valid_referers *.example.com;
只允许指定域名引用,Referer 为空或被屏蔽时一律拒绝,安全性最高,但可能导致部分正常用户加载失败。
五、总结
Nginx 防盗链配置中的 none
和 blocked
是兼容性与安全性之间的平衡点。
none
解决用户直接访问或不带 Referer 的请求blocked
解决被插件或安全策略屏蔽 Referer 的情况
如果目标是防止其他网站引用静态资源,推荐使用 标准模式,既能有效拦截盗链,又不会过多影响用户体验。