Regras de Resposta
Se você não tiver certeza sobre as alterações que está fazendo, prossiga com cautela. Modificações incorretas podem interromper o sistema.
As Regras de Resposta (SRR) são um conjunto ordenado (de cima para baixo; se a regra se aplica, a avaliação para) de regras JSON que o backend avalia para requisições de assinatura recebidas.
As Regras de Resposta substituirão a configuração dos Squads Externos.
Criar uma Regra de Resposta Personalizada
Vamos criar uma Regra de Resposta personalizada que dará a um usuário Android com o aplicativo cliente Happ um Template personalizado e um cabeçalho personalizado.
Deve funcionar assim:
- O usuário solicita uma assinatura
- O Remnawave reconhece que ele está usando o Happ no Android.
- O Remnawave responde com um Template
Happ Androidpersonalizado e adiciona um cabeçalho personalizadoHappTheBestAppOnTheWorld.
Aqui está como a regra poderia ser:
{
"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
Cada regra é um objeto com os seguintes campos:
-
name(string) — obrigatório; 1..50 caracteres"name": "Block Legacy Clients" -
description(string) — opcional; máx. 250 caracteres"description": "Blocks requests from legacy clients" -
enabled(boolean) — obrigatório
Controla se a regra está ativa. Quandofalse, a regra é ignorada durante a avaliação."enabled": true -
operator(enum) — obrigatório;ANDouOR"operator": "AND" // Rule matches only if ALL conditions match
"operator": "OR" // Rule matches if ANY condition matches -
conditions(array)
Lista de condições a avaliar."conditions": [] // Empty = match everything (use for fallback rules) -
responseType(enum) — obrigatório
Determina qual resposta enviar quando a regra corresponder:Tipo Descrição MIHOMOConfig YAML do Mihomo CLASHConfig YAML do Clash STASHConfig YAML do Stash SINGBOXConfig JSON do Sing-box XRAY_JSONConfig JSON do Xray XRAY_BASE64Config do Xray codificada em Base64 BROWSERPágina HTML para navegadores BLOCKHTTP 403 Forbidden STATUS_CODE_404HTTP 404 Not Found STATUS_CODE_451HTTP 451 Unavailable For Legal Reasons SOCKET_DROPInterromper a conexão socket -
responseModifications(array) - opcional
Modificações adicionais a aplicar à resposta. Pode ser usado para fornecer um Template ou cabeçalhos personalizados.subscriptionTemplate(string) - opcional
Definir um Template específico a ser fornecido se a regra corresponder.headers(array) - opcional
Responder com um cabeçalho personalizado.key(string) - opcional
Nome do cabeçalho.value(string) - opcional
Valor do cabeçalho.
applyHeadersToEnd(boolean) - opcional
Por padrão, os cabeçalhos são adicionados ao formar a resposta. Em alguns casos, os cabeçalhos definidos no SRR podem ser substituídos por cabeçalhos de outras partes do sistema (como Squads Externos). Se você definir este sinalizador comotrue, os cabeçalhos do SRR serão adicionados no final, imediatamente antes de a resposta ser enviada. Nesse caso, os cabeçalhos do SRR podem substituir cabeçalhos de outras seções.ignoreHostXrayJsonTemplate(boolean) - opcional
Cada Host pode ter seu próprio Template Xray Json. Se você definir este sinalizador comotrue, o Template Xray Json definido pelo SRR será usado. O Template Xray Json do Host será ignorado.ignoreServeJsonAtBaseSubscription(boolean) - opcional
Em certos cenários, você pode querer servirXRAY_BASE64para aplicativos cliente reconhecidos pelo Panel como capazes de aceitarXRAY_JSONquandoServe JSON at Base Subscriptionestá habilitado.
Se você definir este sinalizador comotrue, a configuraçãoServe JSON at Base Subscriptionserá ignorada (definida comofalse).
"responseType": "SINGBOX",
"responseModifications": {
"applyHeadersToEnd": true,
"headers": [
{
"key": "X-Custom-Header",
"value": "CustomValue"
}
],
"ignoreHostXrayJsonTemplate": true,
"ignoreServeJsonAtBaseSubscription": true,
"subscriptionTemplate": "Singbox Legacy"
}
rules.conditions
-
headerName(string) — obrigatório
O cabeçalho HTTP a verificar. Deve estar em conformidade com a RFC 7230."headerName": "user-agent" // Client app user-agent -
operator(enum) — obrigatório
Operação de comparação a realizar:Operador Descrição EQUALSCorrespondência exata NOT_EQUALSCorrespondência exata inversa CONTAINSSubstring presente NOT_CONTAINSSubstring ausente STARTS_WITHCorrespondência de prefixo NOT_STARTS_WITHAusência de prefixo ENDS_WITHCorrespondência de sufixo NOT_ENDS_WITHAusência de sufixo REGEXExpressão regular NOT_REGEXRegex inversa -
value(string) — obrigatório; 1..255 caracteres
O valor a comparar com o valor do cabeçalho."value": "^sfa|sfi|sfm|sft|karing|singbox|rabbithole" -
caseSensitive(boolean) — obrigatório"caseSensitive": true // The value is compared as is
"caseSensitive": false // The value is lowercased before comparison
Você pode facilmente responder com diferentes Templates para diferentes sistemas operacionais.
No exemplo abaixo, usuários com iOS receberão um JSON Happ iOS, e usuários com Android receberão um 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"
}
}
- Os nomes dos cabeçalhos não diferenciam maiúsculas de minúsculas
"user-agent" === "User-Agent" === "USER-AGENT" - Se um cabeçalho tiver vários valores, eles serão concatenados em uma única string, separados por vírgulas.
- O valor ausente dos cabeçalhos resulta na regra sendo ignorada.