网络错误日志 (NEL)

实验性: 这是一项实验性技术
在生产中使用此技术之前,请仔细检查浏览器兼容性表格

网络错误日志是一种可以通过 NEL HTTP 响应头 配置的机制。这个实验性头部允许网站和应用程序选择接收来自支持浏览器关于失败(如果需要,也可包含成功)网络请求的报告。

报告将发送到一个在 Report-To 头部中定义的报告组。

用法

Web 应用程序通过 NEL 头部选择启用此行为,该头部是一个 JSON 编码 对象

http
NEL: { "report_to": "nel",
       "max_age": 31556952 }

浏览器需要一个被认为是安全的源。

NEL 头部中可以指定以下对象键

report_to

用于发送网络错误报告的 报告 API 组(参见下文)。

max_age

指定策略的生命周期,以秒为单位(类似于 HSTS 策略的时间限制)。所引用的报告组的生命周期应至少与 NEL 策略一样长。

include_subdomains

如果为 true,则策略适用于设置了策略头部的源下的所有子域。如果启用此选项,报告组也应设置为包含子域。

success_fraction

介于 0 和 1 之间的浮点值,指定要报告的成功网络请求的比例。默认为 0,因此如果 JSON 有效载荷中不存在该键,则不会报告任何成功的网络请求。

failure_fraction

介于 0 和 1 之间的浮点值,指定要报告的失败网络请求的比例。默认为 1,因此如果 JSON 有效载荷中不存在该键,则会报告所有失败的网络请求。

上面引用的报告组以通常的方式在 Report-To 头部中定义,例如

http
Report-To: { "group": "nel",
             "max_age": 31556952,
             "endpoints": [
              { "url": "https://example.com/csp-reports" }
             ]
           }

错误报告

在这些示例中,显示了报告 API 响应内容。顶级 "body" 键包含网络错误报告。

HTTP 400 (Bad Request) 响应

json
{
  "age": 20,
  "type": "network-error",
  "url": "https://example.com/previous-page",
  "body": {
    "elapsed_time": 338,
    "method": "POST",
    "phase": "application",
    "protocol": "http/1.1",
    "referrer": "https://example.com/previous-page",
    "sampling_fraction": 1,
    "server_ip": "192.0.2.172",
    "status_code": 400,
    "type": "http.error",
    "url": "https://example.com/bad-request"
  }
}

DNS 名称未解析

请注意,在此报告中,阶段设置为 dns,并且没有可用的 server_ip

json
{
  "age": 20,
  "type": "network-error",
  "url": "https://example.com/previous-page",
  "body": {
    "elapsed_time": 18,
    "method": "POST",
    "phase": "dns",
    "protocol": "http/1.1",
    "referrer": "https://example.com/previous-page",
    "sampling_fraction": 1,
    "server_ip": "",
    "status_code": 0,
    "type": "dns.name_not_resolved",
    "url": "https://example-host.com/"
  }
}

网络错误的类型可以是规范中以下预定义值之一,但浏览器可以添加和发送自己的错误类型

dns.unreachable

用户的 DNS 服务器无法访问

dns.name_not_resolved

用户的 DNS 服务器已响应,但无法解析所请求 URI 的 IP 地址。

dns.failed

由于未涵盖在先前错误中的原因(例如 SERVFAIL),对 DNS 服务器的请求失败。

dns.address_changed

出于安全原因,如果提供原始报告的服务器 IP 地址与错误生成时的当前服务器 IP 地址不同,则报告数据将被降级,仅包含有关此问题的信息,并且类型设置为 dns.address_changed

tcp.timed_out

与服务器的 TCP 连接超时

tcp.closed

TCP 连接被服务器关闭

tcp.reset

TCP 连接被重置

tcp.refused

TCP 连接被服务器拒绝

tcp.aborted

TCP 连接被中止

tcp.address_invalid

IP 地址无效

tcp.address_unreachable

IP 地址无法访问

tcp.failed

由于未涵盖在先前错误中的原因,TCP 连接失败

http.error

用户代理成功收到响应,但其状态码为 4xx5xx

http.protocol.error

由于 HTTP 协议错误,连接中止

http.response.invalid

响应为空、内容长度不匹配、编码不正确和/或导致用户代理无法处理响应的其他情况

http.response.redirect_loop

由于检测到重定向循环,请求被中止

http.failed

由于 HTTP 协议中未涵盖在先前错误中的错误,连接失败

规范

规范
网络错误日志
# nel-response-header

浏览器兼容性

另见