Правила ответа
Если вы не уверены в вносимых изменениях, действуйте с осторожностью. Неверные изменения могут нарушить работу системы.
Правила ответа (SRR) — это упорядоченный (сверху вниз; если правило применяется, оценка останавливается) набор правил в формате JSON, которые бэкенд оценивает для входящих запросов на подписку.
Правила ответа переопределяют настройки внешних отрядов.
Создание пользовательского правила ответа
Давайте создадим пользовательское правило ответа, которое предоставит пользователю Android с клиентским приложением Happ пользовательский шаблон и пользовательский заголовок.
Это должно работать следующим образом:
- Пользователь запрашивает подписку
- Remnawave определяет, что он использует Happ на Android.
- 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) — обязательное
Определяет, какой ответ отправить при совпадении правила:Тип Описание MIHOMOYAML-конфигурация Mihomo CLASHYAML-конфигурация Clash STASHYAML-конфигурация Stash SINGBOXJSON-конфигурация Sing-box XRAY_JSONJSON-конфигурация Xray XRAY_BASE64Конфигурация Xray в кодировке Base64 BROWSERHTML-страница для браузеров 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, будет использован шаблон Xray Json, определённый в SRR. Шаблон Xray Json хоста будет проигнорирован.ignoreServeJsonAtBaseSubscription(boolean) - необязательное
В некоторых сценариях может понадобиться предоставлятьXRAY_BASE64клиентским приложениям, которые панель распознаёт как способные приниматьXRAY_JSON, когда включеноServe JSON at Base Subscription.
Если установить этот флаг в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
Можно легко отвечать разными шаблонами для разных операционных систем.
В приведённом ниже примере пользователи iOS получат JSON Happ iOS, а пользователи Android — JSON Happ Android.
{
"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" - Если заголовок имеет несколько значений, они будут объединены в одну строку, разделённую запятыми.
- Отсутствующее значение заголовка приводит к пропуску правила.