Nginx防盗链核心是valid_referers校验Referer白名单,配合if判断$invalid_referer为真时return 403;需在location块中配置,支持none、通配符、正则,并建议记录日志调试。

在 Nginx 中实现防盗链,核心是判断请求的 Referer 头是否来自允许的域名;不匹配时直接返回 403 禁止访问。结合 return 403 是最简洁高效的做法,无需重写或跳转。
基础防盗链:用 valid_referers + return 403
这是最常用、最推荐的方式。Nginx 提供 valid_referers 指令预校验 Referer,再用 if 判断是否为空(即校验失败),触发 return 403:
- 在
location块中配置,通常针对静态资源路径(如/images/、/static/或后缀如.jpg) -
valid_referers后跟允许的域名(支持通配符*和正则~),也建议加上none(允许空 Referer,比如直接输入 URL 访问) -
if ($invalid_referer)是关键:Nginx 内置变量,校验失败时为真
示例配置:
location ~* \.(jpg|jpeg|png|gif|webp|svg)$ {
valid_referers none blocked server_names *.example.com example.org ~\.google\.;
if ($invalid_referer) {
return 403;
}
}注意 return 403 的作用范围和限制
return 403 在 if 中执行时,会立即终止当前请求处理,返回 403 响应,不进入后续指令(如 try_files 或 proxy_pass)。但需注意:
-
if在 location 中可用,但在 server 或 http 级别慎用,且不能嵌套 -
return不能放在某些上下文中(如日志块或 map 块),必须在可执行上下文内(如 location、if) - 若同时用了
rewrite或proxy_pass,确保return在它们之前,否则可能不生效
进阶:按文件类型或目录精细化控制
可以为不同资源设置不同 Referer 规则。例如图片严格限制,JS/CSS 允许更多来源:
location /images/ {
valid_referers none server_names *.myapp.com;
if ($invalid_referer) {
return 403;
}
}
<p>location ~<em> .(js|css)$ {
valid_referers none server_names </em>.myapp.com *.cdn.com;
if ($invalid_referer) {
return 403;
}
}这样避免一刀切,兼顾安全与兼容性(比如 CDN 回源或第三方统计 JS 可能需要放宽)。
调试技巧:临时记录 Referer 方便排查
上线前建议加一条日志,确认实际收到的 Referer 是否符合预期:
log_format referer_log '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
<p>access_log /var/log/nginx/referer.log referer_log;</p><p>location ~<em> .(jpg|png|gif)$ {
valid_referers none server_names </em>.example.com;
if ($invalid_referer) {
access_log /var/log/nginx/blocked_referer.log referer_log;
return 403;
}
}查看 blocked_referer.log 就能知道哪些 Referer 被拦了,方便调整规则。


















