部分Android设备加载script资源报net::ERR_NAME_NOT_RESOLVED错误
问题背景
通过Chrome inspect调试部分用户Android设备时捕获控制台报错,截图如下:
近百台Android设备中仅1-2台出现net::ERR_NAME_NOT_RESOLVED报错,暂未定位根因。
涉及报错的外部资源引入代码(Django模板HTML片段):
... <script src="https://unpkg.com/react@17/umd/react.production.min.js" crossorigin></script> <script src="https://unpkg.com/react-dom@17/umd/react-dom.production.min.js" crossorigin></script> <script src="https://unpkg.com/smoothscroll-polyfill@0.4.4/dist/smoothscroll.min.js" crossorigin></script> </head>
除unpkg托管的React相关资源外,polyfill、static.ads-twitter、google-analytics等不同归属的外部资源均触发相同的net::ERR_NAME_NOT_RESOLVED报错。
排查与解决方案
net::ERR_NAME_NOT_RESOLVED的本质是域名DNS解析失败,多个完全独立的第三方域名同时解析失败,直接排除单个服务端故障的可能,按以下优先级排查:
- 故障设备本地环境排查
统计故障设备的共性特征,优先确认以下配置:- 设备是否连接了存在域名拦截策略的公共WiFi、企业内网,是否开启了VPN、代理、广告拦截类APP
- 安卓9及以上版本是否开启了自定义私人DNS,部分广告拦截类私人DNS会批量拦截CDN、统计类域名的解析
- 设备本地运营商DNS节点是否出现临时故障
验证方式:将故障设备切换至蜂窝移动网络,关闭所有代理、VPN、广告拦截工具,将系统私人DNS设置为「自动」后刷新页面,若恢复即可确认是本地网络配置问题,和业务代码无关。这类用户侧的配置问题不需要远程修复,做好代码兜底即可。
- 代码侧兜底兼容
公共CDN、第三方统计/广告类资源的解析稳定性不受业务方控制,必须做好容错避免影响主页面可用性:- React、polyfill这类页面渲染依赖的核心资源,不要完全依赖第三方公共CDN,打包后上传至自身业务的同域名静态资源目录部署,从根源规避第三方域名解析失败的风险
- 若需保留CDN加速能力,增加降级逻辑,CDN资源加载失败时自动切换至自有静态资源地址加载,示例代码:
<script src="https://unpkg.com/react@17/umd/react.production.min.js" crossorigin></script> <script>window.React || document.write('<script src="/static/assets/react.production.min.js"><\/script>')</script> - 广告、统计类非核心资源,添加
async/defer属性避免阻塞主页面渲染,同时增加加载失败的捕获逻辑,不触发全局报错
- 特殊场景适配
若故障设备为安卓5及以下的老旧版本,需排查是否存在系统根证书过期、内置DNS服务失效的问题,这类设备本身网络栈支持存在缺陷,无完全兼容的修复方案,最优解是尽可能将所有页面依赖资源部署至同域名下,减少外部域名调用。
注意:若所有资源均为HTTPS协议引入,无需排查HTTP混发问题,该问题不会触发DNS解析类报错。
内容的提问来源于stack exchange,提问作者Psychopomp
相关产品推荐
相关产品推荐

