Règles de réponse
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.
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 :
- L'utilisateur demande un abonnement
- Remnawave reconnaît qu'il utilise Happ sur Android.
- Remnawave répond avec un Template
Happ Androidpersonnalisé 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. Quandfalse, la règle est ignorée lors de l'évaluation."enabled": true -
operator(enum) — requis ;ANDouOR"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 :Type Description 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 surtrue, 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 surtrue, 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 servirXRAY_BASE64aux applications clientes reconnues par le Panel comme capables d'accepterXRAY_JSONlorsqueServe JSON at Base Subscriptionest activé.
Si vous définissez cet indicateur surtrue, le paramètreServe JSON at Base Subscriptionsera ignoré (défini surfalse).
"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érateur Description 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
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"
}
}
- Les noms d'en-têtes sont insensibles à la casse
"user-agent" === "User-Agent" === "USER-AGENT" - Si un en-tête a plusieurs valeurs, elles seront concaténées en une seule chaîne, séparées par des virgules.
- La valeur manquante des en-têtes entraîne l'ignorance de la règle.