新版 Reporting API 已发布。它具有更高的私密性,更有可能在各个浏览器中受到支持。
Reporting API 会告知您访问者在使用您的网站时发生的错误。借助该工具,您可以了解浏览器干预、浏览器崩溃、内容安全政策 (CSP) 违规、COOP/COEP 违规、废弃警告等问题。
Reporting API 推出了新版本。新 API 更精简,更有可能获得各浏览器的支持。
摘要
网站开发者
如果您的网站已有报告功能:请使用新标头 (Reporting-Endpoints
) 迁移到 v1,但保留旧版标头 (Report-To
) 一段时间。请参阅迁移:示例代码。
如果您刚刚开始向网站添加报告功能:请仅使用新标头 (Reporting-Endpoints
)。
⚠️ 在这两种情况下,请务必在所有可能生成报告的响应中设置 Reporting-Endpoints
标头。
报告服务开发者
如果您在维护端点服务或自行运营端点服务,那么当您或外部开发者迁移到 Reporting API v1(Reporting-Endpoints
标头)时,预计会获得更多流量。
请继续阅读,了解详情和示例代码!
网络错误日志记录
我们将开发一种新的网络错误日志记录机制。该机制推出后,请从 Reporting API v0 改用该新机制。
演示和代码
v0 与 v1 之间的区别
具体变化
- API Surface 不同。
Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": ... }, { "url": ... }] } Document-Policy: ...; report-to main-endpoint
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default" Document-Policy: ...; report-to main-endpoint
- 报告的范围不同。
在 v0 中,您只能为部分回复设置报告端点。该来源上的其他文档(网页)会自动使用这些环境端点。
在 v1 中,您需要为所有可能生成报告的响应设置 Reporting-Endpoints
标头。
- 两个 API 支持相同的报告类型,但有一个例外:v1 不支持网络错误报告。如需了解详情,请参阅迁移步骤。
- 目前和未来,各浏览器都不支持 v0。v1 未来更有可能在多种浏览器中受支持。
保持不变的方面
- 报告的格式和结构保持不变。
- 浏览器向端点发送的请求仍然是
Content-type
application/reports+json
的POST
请求。 - v0 和 v1 均支持将某些端点映射到特定报告类型。
default
端点的角色保持不变。Reporting API v1 对
ReportingObserver
没有影响。ReportingObserver
会继续获得对所有可观察报告的访问权限,并且这些报告的格式相同。
v0 与 v1 之间的所有差异
旧版 Reporting API (v0)Report-To 标头 |
新版 Reporting API (v1)Reporting-Endpoints 标头 |
|
---|---|---|
浏览器支持 | Chrome 69 及更高版本和 Edge 69 及更高版本。 | Chrome 96 及更高版本和 Edge 96 及更高版本。Firefox 也支持此功能。Safari 不反对。请参阅浏览器信号。 |
端点 | 将报告发送到多个报告收集器(每个端点组定义多个网址)。 | 将报告发送到特定报告收集器(每个端点只能定义一个网址)。 |
API Surface | 使用 `Report-To` 标头配置命名端点组。 |
使用 `Reporting-Endpoints` 标头配置命名端点。 |
可通过此 API 生成的报告类型 |
|
除网络错误日志记录 (NEL):新版 Reporting API (v1) 不支持此功能外,其他均保持不变。 |
报告范围 | 源网域的技术。 文档的 Report-To 标头会影响来自该来源的其他文档(页面)。
报告的 url 字段仍因文档而异。
|
Document. 文档的 Reporting-Endpoints 标头只会影响该文档。
报告的 url 字段仍因文档而异。
|
报告隔离(批处理) | 如果不同文档(网页)或网站/来源大约在同一时间生成报告且具有相同的报告端点,则会一起批量处理:它们会在同一消息中发送到报告端点。 |
|
支持负载均衡/优先级 | 是 | 否 |
端点开发者:预计会获得更多流量
如果您将自己的服务器设置为报告端点,或者您正在开发或维护作为服务的报告收集器,则该端点的流量会增加。
这是因为,与 Reporting API v0 不同,Reporting API v1 不会批量处理报告。因此,随着应用开发者开始迁移到 Reporting API v1,报告数量将保持不变,但对端点服务器的请求量将会增加。
应用开发者:迁移到 Reporting-Endpoints
(v1)
您该怎么做?
使用新版 Reporting API (v1) 有诸多优势:✅
- 浏览器信号为正面,这意味着 v1 应该支持跨浏览器(而 v0 仅受 Chrome 和 Edge 支持)。
- API 更加精简。
- 我们正在围绕新的 Reporting API (v1) 开发工具。
了解了这一点:
- 如果您的网站已在使用 Reporting API v0 和
Report-To
标头,请迁移到 Reporting API v1(请参阅迁移步骤)。如果您的网站已在使用内容安全政策违规报告功能,请查看CSP 报告的具体迁移步骤。 - 如果您的网站尚未使用 Reporting API,并且您现在要添加报告功能:请使用新版 Reporting API (v1)(
Reporting-Endpoints
标头)。但有一个例外情况:如果您需要使用 Network Error Logging,请使用Report-To
(v0)。Reporting API v1 目前不支持网络错误日志记录。我们将开发一种新的网络错误日志记录机制。⏤在此之前,请使用 Reporting API v0。如果您需要同时使用网络错误日志记录和其他报告类型,请同时使用Report-To
(v0) 和Reporting-Endpoints
(v1)。v0 可提供网络错误日志记录,v1 可提供所有其他类型的报告。
迁移步骤
此次迁移的目标是不会丢失您之前使用 v0 时获得的报告。
第 1 步(立即执行):同时使用
Report-To
(v0) 和Reporting-Endpoints
(v1) 标头。这样一来,您可以:
- 借助
Reporting-Endpoints
(v1),从较新版本的 Chrome 和 Edge 客户端获取报告。 - 借助
Report-To
(v0),可以生成来自旧版 Chrome 和 Edge 客户端的报告。
支持
Reporting-Endpoints
的浏览器实例将使用Reporting-Endpoints
,而不支持Reporting-Endpoints
的实例将回退到Report-To
。v0 和 v1 的请求和报告格式相同。- 借助
第 2 步(立即执行):确保为所有可能会生成报告的响应设置
Reporting-Endpoints
标头。对于 v0,您可以选择仅对某些响应设置报告端点,该源中的其他文档(页面)将使用此“环境”端点。对于 v1,由于作用域不同,您需要对所有可能生成报告的响应设置
Reporting-Endpoints
标头。第 3 步(稍后开始):当您的所有或大多数用户都更新到较新版本的 Chrome 或 Edge 安装程序(96 及更高版本)后,请移除
Report-To
(v0),仅保留Reporting-Endpoints
。有一个例外情况:如果您确实需要网络错误日志记录报告,请保留
Report-To
,直到为网络错误日志记录提供新机制。
请参阅迁移手册中的代码示例。
CSP 报告的迁移步骤
您可以通过以下两种方式配置 Content-Security-Policy 违规报告:
- 仅使用 CSP 标头(通过
report-uri
指令)。此功能在 Chrome、Firefox、Safari 和 Edge 等多种浏览器中受支持。报告采用内容类型application/csp-report
发送,且采用 CSP 专用格式。这些报告称为“CSP 级别 2 报告”,不依赖于 Reporting API。 - 对于 Reporting API,您可以通过
Report-To
标头(旧版)或较新的Reporting-Endpoints
(v1)进行设置。只有 Chrome 和 Edge 支持此功能。报告请求的格式与其他 Reporting API 请求相同,内容类型也相同(application/reports+json
)。
不再建议使用第一种方法(仅使用 report-uri
),而使用第二种方法有几个好处。具体而言,借助该 API,您可以使用单一方式为所有报告类型设置报告以及设置通用端点(因为通过 Reporting API ⏤CSP 生成的所有报告请求和其他 ⏤ 均采用相同的格式 application/reports+json
。)
不过,只有少数浏览器支持 report-to
。因此,建议您将 report-uri
与 Reporting API 方法(Report-To
,最好是 Reporting-Endpoints
)搭配使用,以便从多个浏览器获取 CSP 违规报告。在能够识别 report-uri
和 report-to
的浏览器中,如果存在 report-to
,系统会忽略 report-uri
。在仅识别 report-uri
的浏览器中,系统只会考虑 report-uri
。
第 1 步(立即执行):如果您尚未添加,请将
report-to
添加到report-uri
旁边。 仅支持report-uri
的浏览器 (Firefox) 将使用report-uri
,同样支持report-to
的浏览器(Chrome、Edge)将使用report-to
。如需指定要在report-to
中使用的命名端点,请同时使用标头Report-To
和Reporting-Endpoints
。这样可确保您从旧版和新版 Chrome 和 Edge 客户端获得报告。第 3 步(稍后开始):当您的所有或大多数用户都更新到较新版本的 Chrome 或 Edge 安装程序(96 及更高版本)后,请移除
Report-To
(v0),仅保留Reporting-Endpoints
。保留report-uri
,以便您仍能针对仅支持report-uri
的浏览器生成报告。
如需查看这些步骤的代码示例,请参阅 CSP 报告迁移。
迁移:示例代码
概览
如果您使用旧版 Reporting API (v0) 获取 COOP(Cross-Origin-Opener-Policy
标头)、COEP (Cross-Origin-Embedder-Policy
) 或文档政策 (Document-Policy
标头) 的违规报告:在迁移到 Reporting API v1 时,您无需更改这些政策标头本身。您需要做的是从旧版 Report-To
标头迁移到新版 Reporting-Endpoints
标头。
如果您使用旧版 Reporting API (v0) 获取 CSP(Content-Security-Policy
标头)的违规报告,则可能需要在迁移到新 Reporting API (v1) 的过程中调整 Content-Security-Policy
。
基本迁移
Report-To: { group: "main-endpoint", "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "endpoints": [ { "url": "https://reports.example/default" }] }
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default" Report-To: { group: "main-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/main" }] }, { group: "default-endpoint", "max_age": 86400, "endpoints": [ { "url": "https://reports.example/default" }] }
Reporting-Endpoints: main-endpoint="https://reports.example/main", default="https://reports.example/default"
请注意,使用 v1 时,您仍然可以向特定端点发送特定报告类型。但每个端点只能有一个网址。
观察所有网页
app.get("/", (request, response) => { response.set("Report-To", …) response.render(...) }); app.get("/page1", (request, response) => { response.render(...) });
// Use a middleware to set the reporting endpoint(s) for *all* requests. app.use(function(request, response, next) { response.set("Reporting-Endpoints", …); next(); }); app.get("/", (request, response) => { response.render(...) }); app.get("/page1", (request, response) => { response.render(...) });
CSP 报告迁移
Content-Security-Policy: ...; report-uri https://reports.example/main
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint Report-To: main-endpoint="https://reports.example/main"
Content-Security-Policy: ...; report-uri https://reports.example/main; report-to main-endpoint Reporting-Endpoints: main-endpoint="https://reports.example/main" Report-To: ...
深入阅读
- 使用 Reporting API 监控 Web 应用(关于 Reporting API 的主要文章)
- 规范:旧版 Reporting API (v0)
- 规范:新的 Reporting API (v1)
非常感谢 Ian Clelland、Eiji Kitamura 和 Milica Mihajlija 对本文的审核和建议。