多租户Nginx防盗链需按域名分组定义referer白名单,通过map提取$host动态生成$valid_referer_pattern,统一location规则匹配静态资源路径,支持租户级例外与安全基线校验。
在多租户、多域名环境下,Nginx 防盗链不能简单套用单域名白名单逻辑——每个租户(子域名或独立域名)的合法来源必须隔离且可动态扩展,同时要避免配置冗余、误拦截或规则冲突。核心思路是:按域名分组定义 referer 白名单,统一复用 location 规则,通过变量动态匹配当前 host,兼顾安全性与可维护性。
多租户场景下,资源通常按租户隔离(如 /t/{tenant-id}/ 或子域名 tenant1.example.com),需提前约定并固化以下两点:
shop1.example.com、blog2.example.com),或主域名+路径前缀(如 example.com/shop1/);推荐前者,便于 Nginx 的 server_name 和 $host 变量直接提取租户标识。/static/ 或 /media/ 下(如 https://shop1.example.com/static/logo.png),不混杂在根路径或任意深度目录中,便于集中 location 拦截。将防盗链逻辑封装在可复用的 location 中,不依赖具体 server 块重复书写。关键在于用 $host 动态提取当前请求域名,并构造合法 referer 模式:
示例配置(放入 http 块或 conf.d 公共 include 文件):
map $host $valid_referer_pattern {default"";~^(?<sub>[a-z0-9-]+).example.com$"$sub.example.com *.example.com";~^example.com$ "example.com *.example.com";# 可追加其他主域,如 ~^.*.myapp.org$"$1.myapp.org *.myapp.org";}location ~* .(jpg|jpeg|png|gif|webp|mp4|mov|avi|pdf|zip|rar|woff2|ttf)$ { valid_referers none blocked $valid_referer_pattern; if ($invalid_referer) { return 403;
或返回统一提示页:return 302 /blocked.html;}}
map 指令根据 $host 提取子域名(如 shop1.example.com → shop1.example.com),并生成对应的白名单字符串;valid_referers 直接引用变量,自动适配各租户;default "" 表示未匹配域名默认无白名单,强化安全兜底。生产环境中常需为特定租户开放第三方合作域名(如 CMS 平台、CDN 回源、管理后台),应避免硬编码到全局 map 中,而是采用“租户配置优先”策略:
server 块内,用 set 覆盖 $valid_referer_pattern 变量值:set $valid_referer_pattern "shop1.example.com api.partner-cdn.com *.cms-platform.io";
location ~ ^/t/shop1/static/ { valid_referers none blocked shop1.example.com api.partner-cdn.com; ... }
*.com)或裸 IP 授权。该模板上线前必须校验以下基线要求,否则视为配置不生效:
ngx_http_referer_module 已编译(nginx -V 2>&1 | grep -o with-http-referer-module);.pdf、.zip 等文件类型,none 必须显式排除(即不写 none),仅允许明确域名;$invalid_referer 字段,便于审计异常 referer 请求。