Aller au contenu principal

Règles de réponse

attention

Si vous n'êtes pas sûr des modifications que vous effectuez, procédez avec prudence. Des modifications incorrectes peuvent perturber le système.

Les règles de réponse (SRR) sont un ensemble ordonné (de haut en bas ; si la règle s'applique, l'évaluation s'arrête) de règles JSON que le backend évalue pour les requêtes d'abonnement entrantes.

Templates menu
astuce

Les règles de réponse remplaceront la configuration des Squads externes.

Créer une règle de réponse personnalisée

Créons une règle de réponse personnalisée qui donnera à un utilisateur Android avec l'application client Happ un Template personnalisé et un en-tête personnalisé.

Cela devrait fonctionner comme suit :

  1. L'utilisateur demande un abonnement
  2. Remnawave reconnaît qu'il utilise Happ sur Android.
  3. Remnawave répond avec un Template Happ Android personnalisé et ajoute un en-tête personnalisé HappTheBestAppOnTheWorld.

Voici à quoi pourrait ressembler la règle :

{
"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

Chaque règle est un objet avec les champs suivants :

  • name (string) — requis ; 1..50 caractères

    "name": "Block Legacy Clients"
  • description (string) — optionnel ; max 250 caractères

    "description": "Blocks requests from legacy clients"
  • enabled (boolean) — requis
    Contrôle si la règle est active. Quand false, la règle est ignorée lors de l'évaluation.

    "enabled": true
  • operator (enum) — requis ; AND ou OR

    "operator": "AND" // Rule matches only if ALL conditions match
    "operator": "OR" // Rule matches if ANY condition matches
  • conditions (array)
    Liste des conditions à évaluer.

    "conditions": []  // Empty = match everything (use for fallback rules)
  • responseType (enum) — requis
    Détermine quelle réponse envoyer lorsque la règle correspond :

    TypeDescription
    MIHOMOConfig YAML Mihomo
    CLASHConfig YAML Clash
    STASHConfig YAML Stash
    SINGBOXConfig JSON Sing-box
    XRAY_JSONConfig JSON Xray
    XRAY_BASE64Config Xray encodée en Base64
    BROWSERPage HTML pour les navigateurs
    BLOCKHTTP 403 Forbidden
    STATUS_CODE_404HTTP 404 Not Found
    STATUS_CODE_451HTTP 451 Unavailable For Legal Reasons
    SOCKET_DROPInterrompre la connexion socket
  • responseModifications (array) - optionnel
    Modifications supplémentaires à appliquer à la réponse. Peut être utilisé pour fournir un Template ou des en-têtes personnalisés.

    • subscriptionTemplate (string) - optionnel
      Définir un Template spécifique à fournir si la règle correspond.
    • headers (array) - optionnel
      Répondre avec un en-tête personnalisé.
      • key (string) - optionnel
        Nom de l'en-tête.
      • value (string) - optionnel
        Valeur de l'en-tête.
    • applyHeadersToEnd (boolean) - optionnel
      Par défaut, les en-têtes sont ajoutés lors de la formation de la réponse. Dans certains cas, les en-têtes définis dans SRR peuvent être remplacés par des en-têtes d'autres parties du système (comme les Squads externes). Si vous définissez cet indicateur sur true, les en-têtes de SRR seront ajoutés à la fin, juste avant l'envoi de la réponse. Dans ce cas, les en-têtes SRR peuvent remplacer les en-têtes d'autres sections.
    • ignoreHostXrayJsonTemplate (boolean) - optionnel
      Chaque Host peut avoir son propre Template Xray Json. Si vous définissez cet indicateur sur true, le Template Xray Json défini par le SRR sera utilisé. Le Template Xray Json du Host sera ignoré.
    • ignoreServeJsonAtBaseSubscription (boolean) - optionnel
      Dans certains scénarios, vous pourriez vouloir servir XRAY_BASE64 aux applications clientes reconnues par le Panel comme capables d'accepter XRAY_JSON lorsque Serve JSON at Base Subscription est activé.
      Si vous définissez cet indicateur sur true, le paramètre Serve JSON at Base Subscription sera ignoré (défini sur false).
    "responseType": "SINGBOX",
    "responseModifications": {
    "applyHeadersToEnd": true,
    "headers": [
    {
    "key": "X-Custom-Header",
    "value": "CustomValue"
    }
    ],
    "ignoreHostXrayJsonTemplate": true,
    "ignoreServeJsonAtBaseSubscription": true,
    "subscriptionTemplate": "Singbox Legacy"
    }

rules.conditions

  • headerName (string) — requis
    L'en-tête HTTP à vérifier. Doit être conforme à la RFC 7230.

    "headerName": "user-agent"    // Client app user-agent
  • operator (enum) — requis
    Opération de comparaison à effectuer :

    OpérateurDescription
    EQUALSCorrespondance exacte
    NOT_EQUALSCorrespondance exacte inversée
    CONTAINSSous-chaîne présente
    NOT_CONTAINSSous-chaîne absente
    STARTS_WITHCorrespondance de préfixe
    NOT_STARTS_WITHAbsence de préfixe
    ENDS_WITHCorrespondance de suffixe
    NOT_ENDS_WITHAbsence de suffixe
    REGEXExpression régulière
    NOT_REGEXRegex inverse
  • value (string) — requis ; 1..255 caractères
    La valeur à comparer avec la valeur de l'en-tête.

    "value": "^sfa|sfi|sfm|sft|karing|singbox|rabbithole"
  • caseSensitive (boolean) — requis

    "caseSensitive": true   // The value is compared as is
    "caseSensitive": false // The value is lowercased before comparison
Templates spécifiques au système d'exploitation

Vous pouvez facilement répondre avec différents Templates selon les systèmes d'exploitation.

Dans l'exemple ci-dessous, les utilisateurs iOS recevront un JSON Happ iOS, et les utilisateurs Android recevront un 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"
}
}
Règles de résolution des en-têtes
  1. Les noms d'en-têtes sont insensibles à la casse
    "user-agent" === "User-Agent" === "USER-AGENT"
  2. Si un en-tête a plusieurs valeurs, elles seront concaténées en une seule chaîne, séparées par des virgules.
  3. La valeur manquante des en-têtes entraîne l'ignorance de la règle.