Nginx通过map动态提取子域名构造租户专属referer白名单,统一location规则匹配静态资源路径,支持合作方授权、高风险租户精确验证及日志/响应头可观测性保障。

在多租户 SaaS 平台中,Nginx 防盗链不能为所有租户共用一套 referer 白名单——否则 shop1.example.com 的图片可能被 shop2.example.com 任意引用,失去隔离性;也不能为每个租户单独写一堆 location 块,导致配置爆炸、难以维护。核心解法是:**用 map 动态提取租户标识,构造租户专属 referer 模式,统一复用 location 规则**。
按子域名自动识别租户并生成 referer 白名单
假设租户使用二级子域名(如 tenant-a.example.com、tenant-b.example.com),在 http 块中定义:
- 用 map 提取 $host 中的子域名部分,并拼出该租户合法的 referer 范围,例如:
tenant-a.example.com → "tenant-a.example.com *.example.com" - 匹配主域名访问(如 example.com)也纳入同一白名单组,避免官网页面引用失败
- 未匹配任何规则的域名(如恶意仿冒域名)默认 $valid_referer_pattern 为空字符串,触发防盗链拦截
集中 location 规则匹配静态资源路径
所有租户的图片、字体、视频等静态资源统一放在 /static/ 或 /media/ 下(如 https://tenant-a.example.com/static/logo.png)。只需一个 location 块覆盖全部:
- 正则匹配常见后缀:
location ~* \.(jpg|png|webp|woff2|mp4)$ - 直接引用 $valid_referer_pattern 变量:
valid_referers none blocked $valid_referer_pattern; - 拦截非法请求:
if ($invalid_referer) { return 403; }
支持租户级例外与合作方授权
某些租户需要额外允许第三方站点(如营销平台、CDN 域名),可在 map 中扩展逻辑:
- 为特定租户追加白名单项,例如:
~^tenant-a\.example\.com$ "tenant-a.example.com marketing-cdn.net *.example.com" - 用独立 map 分离“基础白名单”和“合作方白名单”,便于灰度开关或权限审批
- 对高风险租户(如金融类)可强制禁用 *.example.com 通配,只允准精确域名
验证与可观测性保障隔离有效
防盗链是否真正按租户生效,不能只靠测试,需落地可观测手段:
- 日志中记录实际匹配的 referer 和 $valid_referer_pattern 值,例如添加:
$http_referer $valid_referer_pattern - 响应头注入租户标识:
add_header X-Tenant-ID $tenant_id;,方便前端或监控识别上下文 - 对返回 403 的请求,统一跳转到带租户参数的提示页(如
/blocked?tenant=tenant-a),便于运营分析误拦


















