应针对 zip、pdf 等静态文件在 server 块内单独配置 location ~.(zip|pdf)(?.)?$,配合 valid_referers none blocked 域名白名单,前置 return 403;避免与 try_files 顺序颠倒或误用重定向。

针对 zip、pdf 等特定静态文件类型单独启用 Referer 防盗链,关键是把规则精准落在匹配这些后缀的 location 块中,避免影响 HTML、API 或其他资源。它不是全局开关,而是“按需加锁”。
只对 zip 和 pdf 文件启用防盗链
在 server 配置内,新增一个专用于这类文件的 location 块,用正则精准匹配后缀:
- 使用
~*(忽略大小写)匹配常见变体,如.zip、.ZIP、.Pdf、.pdf?ver=1等 - 推荐写法:
location ~* \.(zip|pdf)(\?.*)?$ { ... },括号捕获可选查询参数,防止带 ? 的下载链接被误拦 - 不要写成
location /download/这类路径前缀——除非你确保所有 zip/pdf 都严格放在该路径下;否则容易漏防或误伤
白名单必须包含实际访问场景
zip 和 pdf 常被直接下载或嵌入 iframe,Referer 更易为空或被清空,白名单要更务实:
-
必须保留
none:用户点击书签、邮件链接、微信内直接打开 PDF,Referer 通常为空 -
加上
blocked:企业内网、某些安全浏览器、HTTPS 页面跳转到 HTTP 资源时,Referer 可能被截断为非 URL 格式 - 只列真正需要的域名,例如:
valid_referers none blocked example.com *.example.com partner-site.org; - 避免泛用
server_names——它依赖server_name指令,且不自动包含 www 子域,容易遗漏
拦截动作建议返回 403 而非重定向
zip/pdf 是二进制文件,重定向到图片或页面会破坏下载流程,用户可能看到乱码或下载失败:
- 用
return 403;最稳妥,客户端明确知道“无权访问” - 若需提示,应在前端页面(如下载按钮)做权限校验,而不是靠 Nginx 重定向返回 HTML
- 慎用
rewrite ... last:last 会重新匹配 location,可能引发循环或路径错乱;break 不触发新匹配但仅限当前块,适用性低
注意和已有配置的冲突
如果站点已用 try_files 或 alias 提供文件服务,防盗链 if 必须放在它们之前:
- 错误顺序(防盗链失效):
try_files $uri =404; if ($invalid_referer) { return 403; } - 正确顺序:
if ($invalid_referer) { return 403; } try_files $uri =404; - 原因:Nginx 在
try_files找不到文件时直接返回 404,根本不会执行后续 if;而防盗链应是“第一道门”











