移动端网络请求 DNS 解析失败为何无法上报 NEL 报告?
检查 NEL 头部配置中的 include_subdomains 选项是否开启,以及 Report-To 头部是否包含子域信息,否则 DNS 错误报告可能被忽略。
检查 NEL 头部配置中的 include_subdomains 选项
在移动端网页中,如果希望捕获 DNS 解析阶段的网络错误并上报,需确认 NEL 响应头中是否包含 include_subdomains 字段。根据资料,该字段仅对 DNS 相关的网络错误生效,且必须为 true 才能启用子域策略。如果该字段缺失、为 false 或用于非 DNS 错误,NEL 策略将不会对子域生效。
排查时,首先查看服务器返回的 NEL 头部内容。确保 JSON 对象中存在 include_subdomains: true,并且该策略仅针对 DNS 解析失败(如 dns.name_not_resolved 或 dns.unreachable)生效。若配置错误,浏览器将不会生成并上报此类错误报告。
验证 Report-To 头部是否包含子域信息
即使 NEL 头部配置正确,若 Report-To 头部未正确设置 reporting group,错误报告也无法发送。资料指出,NEL 策略引用的 reporting group 必须在 Report-To 头部中定义,且该 group 也必须包含子域信息才能使 include_subdomains 选项生效。
操作步骤是检查响应中的 Report-To 头部。确认其中定义的 group(如 nel)对应的配置对象中,endpoints 列表包含目标接收 URL,且该 group 的生命周期(max_age)至少与 NEL 策略的 max_age 相同。若子域信息缺失,即便 include_subdomains 为 true,DNS 错误报告仍会被忽略。
确认错误类型与 phase 字段匹配
在 NEL 报告的 JSON payload 中,phase 字段用于标识错误发生的网络阶段。对于 DNS 解析失败,phase 必须为 dns。资料示例显示,当发生 DNS 名称解析错误时,报告中的 phase 为 dns,且不包含 server_ip。
验证结果时,打开上报接口接收到的 JSON 数据。检查 body 中的 phase 是否为 dns,以及 type 是否为 dns.name_not_resolved 或 dns.unreachable。如果 phase 不是 dns,说明该错误未在 DNS 阶段捕获,可能是后续阶段(如 TCP 或 HTTP)的错误,此时 NEL 的 include_subdomains 配置对该错误无效。
检查采样率与默认值设置
NEL 头部还包含 success_fraction 和 failure_fraction 两个可选字段,用于控制上报比例。资料说明,这两个值默认为 0 和 1,分别表示不上报成功请求和上报所有失败请求。如果手动设置了这些值,需确保它们符合预期,否则可能导致部分错误未被上报。
若怀疑采样率导致遗漏,可临时将 failure_fraction 设置为 1(即上报所有失败请求)进行测试。同时,确保 NEL 策略的 max_age 设置合理,避免因策略过期导致报告被丢弃。通过调整这些参数并观察上报数据,可以确认是否因采样率设置不当导致 DNS 错误未显示。
资料与延伸阅读
你可以通过以下原始资料核对文中概念,并继续深入阅读。