在 alias 路径下配置防盗链,必须将 valid_referers 和 if ($invalid_referer) 规则置于同一 location 块内,确保校验生效;白名单按引用页面域名设置,非 alias 路径;推荐用 return 403 避免 rewrite 引发的路径错乱或循环拦截。

在 alias 路径下配置防盗链,关键不是换掉指令,而是确保 valid_referers 和 if ($invalid_referer) 逻辑仍能正确生效——因为 alias 本身不改变请求头校验流程,但会影响资源定位与规则匹配范围。
必须把防盗链规则写在 alias 所在的 location 块内
alias 是路径映射指令,常用于将 URL 路径指向非根目录下的静态文件(比如 /static/ → /var/www/assets/)。防盗链规则若写在外部 server 或其他 location 中,根本不会触发校验。
- ✅ 正确:防盗链配置和
alias同处一个location块中 - ❌ 错误:把
valid_referers放到server级或另一个不匹配资源的location里 - ⚠️ 注意:
alias不支持正则 location 的末尾斜杠省略写法(如location ~* \.png$ { alias /data/img/; }是非法的),推荐用前缀匹配或精确匹配保证稳定性
白名单要覆盖真实访问来源,尤其注意 alias 路径的引用上下文
用户从页面引用 /static/logo.png,Referer 是页面域名(如 https://example.com/about),不是 /static/ 本身。所以白名单跟普通防盗链一样,按域名设,不是按 alias 路径设。
- 保留
none:允许书签直连、调试输入 URL、HTTPS 页面加载 HTTP 静态资源时 Referer 被清空等情况 - 保留
blocked:兼容微信内置浏览器、某些 App WebView 或企业防火墙过滤后的 Referer(值存在但无协议头) - 写全主域和子域:
example.com *.example.com;如果用了 CDN,加~\.cdn\.example\.com$(正则需转义点号并锚定结尾) - 避免只写
server_names:它只匹配server_name指令声明的域名,不自动包含 CNAME 或 CDN 域名
确保 alias 目录下的资源可被正常定位,且防盗链不误伤自身
alias 替换的是整个匹配路径,不是追加。若 location 是 location /static/,alias 是 /var/www/assets/,那么请求 /static/css/app.css 实际读取的是 /var/www/assets/css/app.css。防盗链规则必须精准匹配这类请求路径。
- 推荐用前缀匹配保护整段 alias 路径:
location /static/ { alias /var/www/assets/; ... } - 如果只想保护图片,可用嵌套正则:
location ^~ /static/ { alias /var/www/assets/; location ~* \.(jpg|png|gif|webp)$ { ... } } - 务必验证 root/alias 下对应文件真实存在,否则 403 可能是文件找不到,而非防盗链拦截
- 禁止让防盗链规则也作用于提示图本身(如返回
/static/forbidden.png),否则会循环拦截;应单独配一个无防盗链的 location 处理该图
拦截动作建议用 return 403,慎用 rewrite 或 redirect
在 alias 场景下,rewrite 易出错:rewrite 后的 URI 会重新进入 location 匹配流程,可能再次命中当前 alias 块,导致递归或路径错乱。
- ✅ 推荐:
if ($invalid_referer) { return 403; }—— 简洁明确,不触发重匹配 - ✅ 可选:
if ($invalid_referer) { return 302 /img/placeholder.png; },但要确保/img/是独立 location 且不启用防盗链 - ❌ 避免:
rewrite ^(.*)$ /static/forbidden.png break;—— break 不跳出 alias 上下文,仍可能二次校验 - ❌ 避免 301/302 跳转到真实资源路径 —— 泄露原始路径,失去防盗意义











