Network Error Logging
Experimental: これは実験的な機能です。
本番で使用する前にブラウザー互換性一覧表をチェックしてください。
ネットワークエラーロギングは、HTTP の NEL
*レスポンスヘッダー*を使って設定できるメカニズムです。この実験的なヘッダーにより、ウェブサイトやアプリケーションは、対応しているブラウザーから、失敗した (必要であれば成功した) ネットワーク読み取りに関するレポートを受け取ることを選択することができます。
レポートは、 Report-To
ヘッダーで定義された報告グループに送信されます。
使用方法
ウェブアプリケーションは、 *JSON エンコード*されたオブジェクトである NEL ヘッダーを使って、この動作を選択します。
NEL: { "report_to": "nel", "max_age": 31556952 }
ブラウザーから安全と認識されたオリジンが必要です。
以下のオブジェクトキーが NEL ヘッダーで指定されています。
- report_to
-
ネットワークエラーレポートの送信先となる Reporting API グループです。
- max_age
-
ポリシーの有効期間を秒単位で指定します (HSTS ポリシーが時間制限されているのと同様の方法です)。参照される報告グループは、少なくとも NEL ポリシーと同程度の有効期間を持つ必要があります。
- include_subdomains
-
true の場合、ポリシーは、ポリシーヘッダーが設定されているオリジンの下のすべてのサブドメインに適用されます。このオプションを有効にする場合は、サブドメインを含めるように報告グループを設定する必要があります。
- success_fraction
-
0 と 1 の間の浮動小数点値で、報告するネットワーク要求が成功した割合を指定します。既定値は 0 で、JSON ペイロードにキーが存在しない場合、成功したネットワークリクエストは報告されません。
- failure_fraction
-
0 と 1 の間の浮動小数点値で、報告する失敗したネットワークリクエストの割合を指定します。既定値は 1 で、JSON ペイロードにキーが存在しない場合、失敗したすべてのネットワークリクエストが報告されます。
上記のレポートグループは、 Report-To
ヘッダー内で通常の方法で定義されます。例えば下記のようになります。
Report-To: { "group": "nel", "max_age": 31556952, "endpoints": [ { "url": "https://example.com/csp-reports" } ] }
エラーレポート
これらの例では、Reporting API のペイロード全体を示しています。最上位の "body"
キーには、ネットワークエラーレポートが含まれています。
HTTP 400 (Bad Request) response
{
"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": "137.205.28.66",
"status_code": 400,
"type": "http.error",
"url": "https://example.com/bad-request"
}
}
DNS 名が未解決
なお、このレポートではフェーズが dns
に設定されており、含めることのできる server_ip
はありません。
{
"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
-
DNS サーバーへのリクエストが、以前のエラー (SERVFAIL など) でカバーされない理由で失敗した
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
http.protocol.error
-
コネクションが HTTP プロトコルエラーのために中止された
http.response.invalid
-
レスポンスが空であるか、 content-length が合っていないか、エンコーディングが正しくないか、その他の状況でユーザーエージェントがレスポンスを処理できなかった
http.response.redirect_loop
-
リクエストはリダイレクトループが検出されたため中止された
http.failed
-
コネクションは直前のエラーでカバーされなかった HTTP プロトコルのエラーで失敗した
仕様書
ブラウザーの互換性
BCD tables only load in the browser