Перейти к основному содержимому

Правила ответа

warning

Если вы не уверены в вносимых изменениях, действуйте с осторожностью. Неверные изменения могут нарушить работу системы.

Правила ответа (SRR) — это упорядоченный (сверху вниз; если правило применяется, оценка останавливается) набор правил в формате JSON, которые бэкенд оценивает для входящих запросов на подписку.

Templates menu
подсказка

Правила ответа переопределяют настройки внешних отрядов.

Создание пользовательского правила ответа

Давайте создадим пользовательское правило ответа, которое предоставит пользователю Android с клиентским приложением Happ пользовательский шаблон и пользовательский заголовок.

Это должно работать следующим образом:

  1. Пользователь запрашивает подписку
  2. Remnawave определяет, что он использует Happ на Android.
  3. 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"
}
}
Правила разрешения заголовков
  1. Имена заголовков регистронезависимы
    "user-agent" === "User-Agent" === "USER-AGENT"
  2. Если заголовок имеет несколько значений, они будут объединены в одну строку, разделённую запятыми.
  3. Отсутствующее значение заголовка приводит к пропуску правила.