ボディリライト
Chuteは正規表現またはJSONPath式を使用して、HTTPリクエストおよびレスポンスボディのコンテンツを検索・置換できます。HTTPSトラフィックにはMitM復号が必要です。
ボディリライトルールは[Body Rewrite]セクションで定義されます。各方向(リクエスト / レスポンス)について、1つのメッセージには最初にマッチしたルールのみが適用されます。
[Body Rewrite]
^https://api\.example\.com/response.* response regex "old-text" "new-text"
^https://api\.example\.com/request.* request regex "sensitive" "[redacted]"
^https://api\.example\.com/data.* jsonpath-response jsonpath $.ads null
ルール形式
各ルールは次の一般的な形式に従います:
<URL regex> [direction] <mode> <pattern> <replacement>
注意: URL正規表現は、リクエストURLの一部分ではなく、完全なリクエストURLにマッチする必要があります。任意のパスとクエリ文字列を持つURLにマッチするよう、パターンは通常
.*で終わるようにしてください。
方向
| キーワード | 説明 |
|---|---|
response |
レスポンスボディに適用(省略時のデフォルト) |
request |
リクエストボディに適用 |
モード
| モード | 説明 |
|---|---|
regex |
正規表現による検索と置換 |
jsonpath-response / jsonpath-request / body-jsonpath-response / body-jsonpath-request |
JSONPathベースの変更 |
正規表現モード
デコードされたボディテキストに対して標準的な正規表現の検索と置換を実行します。NSRegularExpression(ICU)を使用し、大文字小文字を区別しないマッチングを行います。置換はキャプチャグループ参照($1、$2など)をサポートします。
<URL regex> [response|request] regex <pattern> <replacement>
例 — JSONレスポンスから広告を削除:
[Body Rewrite]
^https://api\.example\.com/feed.* response regex "\"ads\":\s*\[.*?\]" "\"ads\":[]"
例 — リクエストボディをサニタイズ:
[Body Rewrite]
^https://api\.example\.com/submit.* request regex "\"password\":\s*\".*?\"" "\"password\":\"[FILTERED]\""
例 — キャプチャグループを使用してデータを再フォーマット:
[Body Rewrite]
// "last, first" を "first last" に入れ替え
^https://api\.example\.com/users.* response regex "\"name\":\s*\"(\w+),\s*(\w+)\"" "\"name\":\"$2 $1\""
例 — レスポンスボディ内の埋め込みURLをリライト:
[Body Rewrite]
^https://api\.example\.com.* response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
スペースを含むトークンはダブルクォートで囲む必要があります:
[Body Rewrite]
^https://example\.com.* response regex "old value with spaces" "new value"
トークン内にリテラルのダブルクォートを含めるには、バックスラッシュでエスケープします: \"。
JSONPathモード
JSONPath式を使用してJSONボディを変更します。特定のパスでの値の読み取り、設定、削除をサポートします。
<URL regex> jsonpath-response|jsonpath-request jsonpath <jsonpath-expression> [value]
サポートされるJSONPath構文
| 式 | 説明 |
|---|---|
$.key |
オブジェクトプロパティにアクセス |
$.key.subkey |
ネストされたプロパティにアクセス |
$[0] |
インデックスで配列要素にアクセス |
$.key[0].subkey |
オブジェクトと配列の混合アクセス |
$.items[*].name |
ワイルドカード: 配列内の全アイテム |
$.*.value |
ワイルドカード: 全プロパティ |
値の型
| 値 | 結果 |
|---|---|
"string" |
文字列値に設定 |
42 |
整数に設定 |
3.14 |
浮動小数点数に設定 |
true |
ブール値trueに設定 |
false |
ブール値falseに設定 |
null または省略 |
パスを削除 |
注意: 値をクォートしても文字列型にはなりません — クォートはトークン化の際に取り除かれ、型は残った内容から推論されます。そのため
"42"は数値の42に、"true"はブール値のtrueになります。キーワードnilもnullと同様に削除キーワードとして受け付けられます。
例 — JSONフィールドを設定:
[Body Rewrite]
^https://api\.example\.com/profile.* jsonpath-response jsonpath $.user.name "Anonymous"
例 — JSONフィールドを削除:
[Body Rewrite]
^https://api\.example\.com/data.* jsonpath-response jsonpath $.tracking null
例 — ワイルドカード変更:
[Body Rewrite]
^https://api\.example\.com/list.* jsonpath-response jsonpath $.items[*].hidden true
実践例
JSONレスポンスからトラッキングパラメータを除去
全てのAPIレスポンスからtrackingIdフィールドを削除します。方向ごとに最初にマッチしたルールのみが適用されるため、URLパターンごとに1つのルールを使用してください:
[Body Rewrite]
^https://api\.example\.com/.* jsonpath-response jsonpath $.trackingId null
HTMLレスポンスにスクリプトタグを注入
全てのHTMLページの</body>の前にカスタム<script>タグを追加:
[Body Rewrite]
^https://www\.example\.com/.* response regex "</body>" "<script>console.log('injected')</script></body>"
リクエストログの機密フィールドを墨消し
サーバーに到達する前に、送信リクエストボディ内のAPIキーとトークンを置換します。方向ごとに最初にマッチしたルールのみが適用されるため、両方のフィールドを1つのルールにまとめてください:
[Body Rewrite]
^https://api\.example\.com/.* request regex "\"(apiKey|token)\":\s*\"[^\"]+\"" "\"$1\":\"[REDACTED]\""
レスポンスの日付形式を正規化
ISO日付を短い形式に置換:
[Body Rewrite]
^https://api\.example\.com/.* response regex "(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z" "$1/$2/$3 $4:$5"
アプリ設定の機能フラグを無効化
設定エンドポイントの全ての機能フラグをfalseに強制:
[Body Rewrite]
^https://api\.example\.com/config.* jsonpath-response jsonpath $.features[*].enabled false
キャッシュされたレスポンスのCDN URLをリライト
古いCDNへの全ての参照を新しいものに置換:
[Body Rewrite]
^https://www\.example\.com/.* response regex "https://old-cdn\.example\.com" "https://new-cdn.example.com"
処理パイプライン
ボディリライトは以下を自動的に処理します:
- Content-Encoding:
gzipとdeflateをサポート。サポートされていないエンコーディングはスキップされます。 - Transfer-Encoding: 処理前にチャンク転送エンコーディングをデチャンクします。
- デコード: リライトルールを適用する前にボディを展開します。
- 再エンコード: ボディを再圧縮し、
Content-Lengthを更新します。Transfer-Encodingヘッダーを削除します。 - Accept-Encoding: レスポンスルールがリクエストのURLにマッチした場合、レスポンスがデコード可能なエンコーディングに保たれるよう、リクエストの
Accept-Encodingヘッダーはgzip, deflate, identityに書き換えられます。
リライト処理の最大ボディサイズは128KBです。これより大きいボディは変更されずに通過します。
注意事項
- HTTPSトラフィックの場合、マッチするホスト名に対してMitM復号が有効になっている必要があります。
- 正規表現マッチングは大文字小文字を区別しません。置換テンプレートはICUキャプチャグループ参照をサポートします:
$0(完全一致)、$1(最初のグループ)、$2(2番目のグループ)など。 - JSONPathモードはボディが有効なJSONである場合にのみ適用されます。
- ボディリライトルールはデコードされた(UTF-8)ボディテキストに適用されます。
- 1つのメッセージには、方向(リクエスト / レスポンス)ごとに最初にマッチしたルールのみが適用されます。複数の編集が必要な場合は、1つにまとめたルールを定義してください。
- 存在しないJSONPathを削除してもボディは変更されません。値の設定は、親オブジェクトが存在する場合にキーを作成します。中間パスが欠けている場合は何も起こりません。
本ページは英語版からの翻訳です。内容に相違がある場合は、英語版が優先されます。