レスポンスルール
変更内容について不確かな場合は、慎重に進めてください。誤った変更はシステムを停止させる可能性があります。
レスポンスルール(SRR)は、バックエンドが受信したサブスクリプションリクエストに対して評価する、順序付きの(上から下へ。ルールが適用されたら評価が停止する)JSONルールセットです。
レスポンスルールは外部スクワッドの設定を上書きします。
カスタムレスポンスルールの作成
Happクライアントアプリを使用するAndroidユーザーにカスタムテンプレートとカスタムヘッダーを提供するカスタムレスポンスルールを作成してみましょう。
動作のイメージは次のとおりです:
- ユーザーがサブスクリプションをリクエストする
- RemnaWaveがAndroid上でHappを使用していることを認識する。
- Remnawave がカスタム
Happ Androidテンプレートで応答し、カスタムヘッダーHappTheBestAppOnTheWorldを追加する。
ルールは次のようになります:
{
"name": "Happ Android",
"description": "Serve custom JSON for Android",
"enabled": true,
"operator": "AND", // Both "user-agent" and "x-device-os" must be matched
"conditions": [
{
"caseSensitive": false,
"headerName": "user-agent",
"operator": "CONTAINS",
"value": "happ"
},
{
"caseSensitive": false,
"headerName": "x-device-os",
"operator": "EQUALS",
"value": "android"
}
],
"responseType": "XRAY_JSON",
"responseModifications": {
"subscriptionTemplate": "Happ Android", // Serve the custom Template
"headers": [ // Serve the custom headers
{
"key": "x-provider-id",
"value": "HappTheBestAppOnTheWorld"
}
]
}
}
rules
各ルールは以下のフィールドを持つオブジェクトです:
-
name(string) — 必須;1〜50文字"name": "Block Legacy Clients" -
description(string) — 任意;最大250文字"description": "Blocks requests from legacy clients" -
enabled(boolean) — 必須
ルールがアクティブかどうかを制御します。falseの場合、評価中にルールはスキップされます。"enabled": true -
operator(enum) — 必須;ANDまたはOR"operator": "AND" // Rule matches only if ALL conditions match
"operator": "OR" // Rule matches if ANY condition matches -
conditions(array)
評価する条件のリスト。"conditions": [] // Empty = match everything (use for fallback rules) -
responseType(enum) — 必須
ルールが一致したときに送信するレスポンスを決定します:タイプ 説明 MIHOMOMihomo YAML 設定 CLASHClash YAML 設定 STASHStash YAML 設定 SINGBOXSing-box JSON 設定 XRAY_JSONXray JSON 設定 XRAY_BASE64Base64 エンコードされた Xray 設定 BROWSERブラウザ向け HTML ページ BLOCKHTTP 403 Forbidden STATUS_CODE_404HTTP 404 Not Found STATUS_CODE_451HTTP 451 Unavailable For Legal Reasons SOCKET_DROPソケット接続を切断する -
responseModifications(array) - 任意
レスポンスに適用する追加の変更。カスタムテンプレートやヘッダーを提供するために使用できます。subscriptionTemplate(string) - 任意
ルールが一致した場合に提供する特定のテンプレートを定義します。headers(array) - 任意
カスタムヘッダーで応答します。key(string) - 任意
ヘッダー名。value(string) - 任意
ヘッダーの値。
applyHeadersToEnd(boolean) - 任意
デフォルトでは、レスポンスの形成時にヘッダーが追加されます。場合によっては、SRR で設定されたヘッダーがシステムの他の部分(外部スクワッドなど)のヘッダーによって上書きされることがあります。このフラグをtrueに設定すると、SRR のヘッダーがレスポンス送信直前の最後に追加されます。この場合、SRR のヘッダーが他のセクションのヘッダーを上書きする可能性があります。ignoreHostXrayJsonTemplate(boolean) - 任意
各ホストには独自の Xray Json テンプレートを持つことができます。このフラグをtrueに設定すると、SRR で定義された Xray Json テンプレートが使用されます。ホストの Xray Json テンプレートは無視されます。ignoreServeJsonAtBaseSubscription(boolean) - 任意
Serve JSON at Base Subscriptionが有効な場合に、XRAY_JSONを受け入れられると Panel が認識したクライアントアプリに対してXRAY_BASE64を提供したいシナリオがあるかもしれません。
このフラグをtrueに設定すると、Serve JSON at Base Subscription設定が無視されます(falseに設定されます)。disableHwidCheck(boolean) - 任意
クライアントアプリケーションが HWID を無視する必要がある場合があります。このフラグをtrueに設定すると、HWID サポートチェックが無視されます。
"responseType": "SINGBOX",
"responseModifications": {
"applyHeadersToEnd": true,
"headers": [
{
"key": "X-Custom-Header",
"value": "CustomValue"
}
],
"ignoreHostXrayJsonTemplate": true,
"ignoreServeJsonAtBaseSubscription": true,
"subscriptionTemplate": "Singbox Legacy"
}
rules.conditions
-
headerName(string) — 必須
チェックする HTTP ヘッダー。RFC 7230 に準拠している必要があります。"headerName": "user-agent" // Client app user-agent -
operator(enum) — 必須
実行する比較操作:オペレーター 説明 EQUALS完全一致 NOT_EQUALS完全一致の逆 CONTAINS部分文字列あり NOT_CONTAINS部分文字列なし STARTS_WITHプレフィックス一致 NOT_STARTS_WITHプレフィックスなし ENDS_WITHサフィックス一致 NOT_ENDS_WITHサフィックスなし REGEX正規表現 NOT_REGEX逆正規表現 -
value(string) — 必須;1〜255文字
ヘッダー値と比較する値。"value": "^sfa|sfi|sfm|sft|karing|singbox|rabbithole" -
caseSensitive(boolean) — 必須"caseSensitive": true // The value is compared as is
"caseSensitive": false // The value is lowercased before comparison
異なる OS に対して異なるテンプレートで応答することができます。
以下の例では、iOS ユーザーは Happ iOS JSON を受け取り、Android ユーザーは Happ Android JSON を受け取ります。
{
"name": "Happ Android",
"description": "Serve custom JSON for Android",
"enabled": true,
"operator": "AND",
"conditions": [
{
"caseSensitive": false,
"headerName": "user-agent",
"operator": "CONTAINS",
"value": "happ"
},
{
"caseSensitive": false,
"headerName": "x-device-os",
"operator": "CONTAINS",
"value": "android"
}
],
"responseType": "XRAY_JSON",
"responseModifications": {
"subscriptionTemplate": "Happ Android"
}
},
{
"name": "Happ iOS",
"description": "Serve custom JSON for iOS",
"enabled": true,
"operator": "AND",
"conditions": [
{
"caseSensitive": false,
"headerName": "user-agent",
"operator": "CONTAINS",
"value": "happ"
},
{
"caseSensitive": false,
"headerName": "x-device-os",
"operator": "CONTAINS",
"value": "ios"
}
],
"responseType": "XRAY_JSON",
"responseModifications": {
"subscriptionTemplate": "Happ iOS"
}
}
- ヘッダー名は大文字小文字を区別しません
"user-agent" === "User-Agent" === "USER-AGENT" - ヘッダーに複数の値がある場合、それらはカンマで区切られた単一の文字列に連結されます。
- ヘッダーの値が欠落している場合、ルールはスキップされます。