Nginx 可为不同域名站点在各自 server 块中独立配置 UA 过滤规则:需正确设置 server_name,用 if + $http_user_agent 判断并 return 或 rewrite,注意 if 位置、正则转义及 CDN 对 UA 的影响。

想用 Nginx 为不同域名站点分别设置 UA(User-Agent)过滤规则?关键不是“全局拦截”,而是让每个 server 块独立识别自身域名 + 自定义 UA 策略。下面直接讲清楚怎么配、为什么这么配、哪些坑要避开。
一、确认每个站点已用 server_name 正确分离
Nginx 的 UA 过滤必须依托于明确的虚拟主机上下文。确保每个站点都有唯一的 server_name,且不混用通配符或泛解析覆盖多个业务逻辑:
- ✅ 推荐写法:
server_name example.com www.example.com; - ⚠️ 避免写法:
server_name *.example.com;(除非所有子域策略完全一致) - ❌ 错误写法:
server_name _;或空server_name(无法精准绑定 UA 规则)
二、在对应 server 块内用 if + $http_user_agent 实现 UA 判断
Nginx 不支持在 location 外直接 return,但允许在 server 或 location 中用 if 检查请求头。注意:if 在 location 外是安全的,只要不嵌套或滥用 rewrite:
- 屏蔽某站点的微信内置浏览器:
if ($http_user_agent ~* "MicroMessenger") { return 403; } - 只允许 Chrome 和 Safari 访问管理后台:
if ($http_user_agent !~* "(Chrome|Safari)") { return 403; } - 注意大小写:加 i 标志更稳妥,如
~* "micromessenger"
三、进阶:按 UA 分流到不同后端或返回静态页
不止是拦截,还能做轻量级适配。比如移动端 UA 走 mobile 后端,爬虫 UA 返回 robots.txt,都在同一 server 内完成:
- 给手机用户返回简化版页面:
if ($http_user_agent ~* "(iPhone|Android|Mobile)") { rewrite ^(.*)$ /mobile$1 break; } - 识别主流爬虫并统一响应:
if ($http_user_agent ~* "(Baiduspider|Googlebot|bingbot)") { return 200 "Hello, crawler.\n"; } - 注意:rewrite 后需配合 root 或 alias 定义 mobile 目录,否则 404
四、避坑提醒:这些细节决定是否生效
UA 过滤看似简单,但线上常因配置位置或正则细节失败:
- if 必须写在 server 块内,不能放在 http 全局块(否则无法区分域名)
- UA 字符串可能含空格、括号、斜杠,正则中需转义特殊字符,例如:
"QQ\/[0-9.]+" - 某些 CDN 或反向代理会改写或清空 $http_user_agent,先用
log_format打印日志验证原始值 - return 403 后不会继续匹配 location,但 return 302/301 会触发重定向,注意循环风险
把 UA 控制逻辑收束到各 server 块里,既隔离又灵活。不需要 Lua 或第三方模块,原生 Nginx 就能稳稳跑起来。

















