Nginx 可通过 location 块内 if 判断空或全空白 User-Agent 并 return 403,精准拦截 /download/ 等目录下的异常下载请求,结合文件扩展名白名单(如 .zip、.pdf)和 valid_referers 可提升准确性,需避免误伤健康检查及合法无 UA 接口。

直接在 Nginx 中拦截空 User-Agent 的下载请求,是防止盗链和异常采集的有效补充手段——它不依赖 Referer(防不了伪造),也不增加后端负担,适合保护 /download、/files 等资源目录。
为什么空 UA 值得警惕
真实浏览器几乎从不发送空 User-Agent;而批量下载工具(如 wget、curl 脚本)、扫描器、自动化采集程序常省略或清空该字段。尤其当请求同时缺少 Referer 且目标为二进制资源(.zip、.pdf、.exe)时,空 UA 是高风险信号。
在 location 中精准拦截空 UA 下载请求
把规则放在具体资源路径的 location 块内,避免误伤 API 或静态页:
- 用 ~* ^$ 匹配完全为空的 UA 字符串
- 用 ~* ^[[:space:]]*$ 匹配全空白(空格、制表符等)
- 搭配 if + return 403,轻量阻断,不记录日志可减少 I/O
示例配置(保护 /download/ 下所有文件):
location ^~ /download/ {
if ($http_user_agent ~* "^$|^[[:space:]]*$") {
return 403;
}
# 其他防盗链逻辑(如 valid_referers)可继续叠加
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
}
try_files $uri =404;
}增强判断:空 UA + 特定扩展名组合拦截
仅拦空 UA 可能偏宽,加一层文件类型限制更精准:
- 匹配常见下载类后缀:.zip、.rar、.pdf、.docx、.exe、.dmg
- 用 map 预定义扩展名白名单,再结合 UA 判断
- 避免用正则反复解析,提升高并发下稳定性
参考写法(放在 http 块顶层):
map $request_uri $is_download_file {
default 0;
~*\.(zip|rar|pdf|exe|dmg|iso)$ 1;
}
<p>location ^~ /download/ {
if ($http_user_agent ~<em> "^$|^[[:space:]]</em>$") {
if ($is_download_file = 1) {
return 403;
}
}</p><h1>后续正常处理...</h1><p>}注意避开常见误区
空 UA 过滤要谨慎落地:
- 不要放在全局 server 块顶部——会误杀健康检查、监控探针、部分运维脚本
- 避免在 proxy_pass 前对空 UA 返回 444(断连),可能干扰连接池复用
- 若网站依赖某些无 UA 的合法接口(如嵌入式设备上报),需单独 location 白名单放行


















