Nginx中valid_referers可实现防盗链,需配置none、blocked、server_names及主流搜索引擎域名(如.google.com、.baidu.com等),配合if($invalid_referer)返回403或默认图。

在 Nginx 中,valid_referers 用于限制请求来源(Referer 头),常用于防盗链。若希望**只允许本站域名访问资源,同时放行主流搜索引擎的爬虫(如 Google、Bing、百度)**,需明确列出可信 Referer 模式,并配合 if 和 return 实现拦截逻辑。
允许本站域名 + 主流搜索引擎的 referer 配置
以下配置放在 server 或 location 块中,适用于图片、CSS、JS 等静态资源防盗链:
- 使用
valid_referers定义白名单:包括空 Referer(直接访问)、本站主域名及 www 子域名、常见搜索引擎域名 - 用
if ($invalid_referer)判断不匹配时返回 403 或重定向到默认图 - 注意:Nginx 的
valid_referers不支持正则捕获变量,但支持域名通配和精确匹配
示例配置(以 example.com 为例):
location ~* \.(jpg|jpeg|png|gif|webp|css|js)$ {
valid_referers
none
blocked
server_names
example.com www.example.com
*.google.com *.google.*.com
*.bing.com
*.baidu.com
*.yandex.com
*.duckduckgo.com;
<pre class='brush:php;toolbar:false;'>if ($invalid_referer) {
# 返回 403 禁止访问
return 403;
# 或返回一张默认提示图(需确保该图本身不触发防盗链)
# rewrite ^/.*$ /images/forbidden.png break;
}}
关键细节说明
server_names 表示自动包含当前 server_name 指令中定义的所有域名(如 server_name example.com www.example.com;),可简化写法,但仍建议显式列出以增强可读性与可控性。
none 允许无 Referer 的请求(如用户直接在地址栏输入 URL、HTTPS 页面引用 HTTP 资源等);blocked 允许 Referer 被防火墙或浏览器清理后只剩协议+域名(无路径)的情况。
搜索引擎域名要覆盖常见变体:
– Google:用 *.google.com 和 *.google.*.com(兼顾 google.co.uk、google.de 等)
– 百度:*.baidu.com(含 www.baidu.com、image.baidu.com)
– Bing:*.bing.com
– Yandex、DuckDuckGo 同理
注意事项与避坑点
-
if在 location 中使用是安全的,但避免在server级别滥用(Nginx 官方不推荐在 server 块中用 if) - 搜索引擎爬虫有时会省略 Referer,或使用非常规 User-Agent,因此不能完全依赖 Referer 验证;如需强保护,应结合 IP 白名单或 Token 鉴权
- 若站点启用了 HTTPS,且引用资源为 HTTP,浏览器可能因混合内容策略清空 Referer —— 建议全站统一协议
- 配置后务必执行
nginx -t测试语法,并nginx -s reload生效


















