Nginx无法单靠User-Agent识别微信内置浏览器防盗链,需结合Referer白名单与微信UA黑名单双重校验:仅当Referer非法且UA含MicroMessenger等特征时返回403,避免误拦合法微信访问。

Nginx 本身无法直接识别“微信内置浏览器”这一客户端类型来实施防盗链,因为 Referer 字段不包含 UA 信息,而防盗链核心依赖的是 Referer 头(不是 User-Agent)。但你可以结合 Referer + User-Agent 的双重判断,实现对微信内链场景的增强型阻断——尤其适用于那些从微信公众号、小程序跳转页盗用你静态资源的情况。
关键点在于:微信内打开网页时,Referer 通常是 https://mp.weixin.qq.com/ 或 https://weixin110.qq.com/ 等微信域,但真实盗链者可能伪造 Referer;而微信 WebView 的 User-Agent 有固定特征(如含 MicroMessenger),这个字段更难被普通盗链页面伪造(除非主动模拟)。
所以合理策略是:
✅ 对高频被盗资源(如 .jpg, .png, .mp4)做 Referer 白名单 + 微信 UA 黑名单组合拦截
❌ 不单独靠 UA 做防盗链主逻辑(因 if ($http_user_agent ~* MicroMessenger) 在 location 外不推荐,且易误伤正常微信用户)
⚠️ 必须配合 Referer 校验,避免把合法微信访问(如公众号图文页)也拦掉
一、明确要保护的资源路径和后缀
只针对实际被盗严重的资源加限制,例如:
location ~* \.(jpg|jpeg|png|gif|webp|mp4|pdf)$ {
# 后续规则在此 location 内生效
}不要写成 location / 或 location ~* \.,否则可能误拦 API、字体、JS 等。
二、设置 Referer 白名单(基础防盗链)
允许你自己的域名、空 Referer(直接访问)、以及微信官方跳转来源(可选):
valid_referers none blocked
*.yourdomain.com yourdomain.com
https://mp.weixin.qq.com/
https://weixin110.qq.com/
https://servicewechat.com/;-
none:支持用户直接输入 URL 访问(如分享链接到微信后点击打开) -
blocked:兼容某些隐私模式或代理清 Referer 的情况 - 显式加入微信官方域名:让公众号图文页、服务号菜单页等合法引用能通过
⚠️ 注意:
https://mp.weixin.qq.com/是微信 H5 官方入口,但盗链者也能伪造该 Referer。所以它只是“白名单之一”,不能单独依赖。
三、添加微信 UA 黑名单(增强阻断)
在同一个 location 块内,用 if 判断 User-Agent 是否含微信特征,且 Referer 不在白名单中(即双重不满足才拦截):
if ($invalid_referer) {
if ($http_user_agent ~* "MicroMessenger|WeiXin|MQQBrowser") {
return 403;
}
}或者更稳妥写法(避免嵌套 if,用 map 预判):
# 在 http 块顶部定义(一次定义,全局可用)
map $http_user_agent $is_wechat_ua {
default 0;
~*MicroMessenger 1;
~*WeiXin 1;
~*MQQBrowser 1;
}
# 在 location 内
if ($invalid_referer & $is_wechat_ua) {
return 403;
}这样逻辑清晰:仅当 Referer 非法 且 请求来自微信环境时,才拒绝——既防普通盗链,又精准打击“从微信页盗你图再贴到自己站”的行为。
四、响应方式建议:返回 403 而非重定向图
- 微信内嵌浏览器对 403 响应兼容性好,且不会触发二次请求(重写到
/forbidden.png可能引发循环或跨域问题) - 若需提示,建议前端 JS 捕获图片加载失败后展示友好文案,而非 Nginx 层处理
- 日志中可通过
$http_referer和$http_user_agent字段排查拦截是否合理:
log_format referer_ua '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent"';
access_log /var/log/nginx/wechat-block.log referer_ua;补充提醒
- 微信内打开 H5 页面时,Referer 可能为空(尤其 iOS 微信),所以
none必须保留 - 小程序 WebView 的 Referer 是
https://servicewechat.com/,已列入白名单示例 - 此方案仍属“防御性策略”,不能替代鉴权。高价值资源(如付费图片、课程视频)务必叠加 URL 签名或 Token 验证
- 修改后执行
nginx -t && nginx -s reload,切勿 kill 进程
不复杂但容易忽略细节。



















