From 752f2943921e229741892d7b47d2e4fc0e59b114 Mon Sep 17 00:00:00 2001 From: Falknat Date: Fri, 3 Oct 2025 01:59:56 +0700 Subject: [PATCH] Alias WildCard MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Возможность добавлять Alias по маске WildCard --- Backend/WebServer/handler.go | 68 ++++++++++++++++++++++++++++++++++-- README.md | 23 ++++++++++++ 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/Backend/WebServer/handler.go b/Backend/WebServer/handler.go index 2650cde..4b8dc5b 100644 --- a/Backend/WebServer/handler.go +++ b/Backend/WebServer/handler.go @@ -12,6 +12,70 @@ func StartHandler() { http.HandleFunc("/", handler) } +// Проверка wildcard паттерна для alias +func matchWildcardAlias(pattern, host string) bool { + // Если нет звёздочки - точное совпадение + if !strings.Contains(pattern, "*") { + return pattern == host + } + + // Поддержка wildcard: *.example.com, example.*, *example*, * + // Заменяем * на регулярное выражение + pattern = strings.ReplaceAll(pattern, ".", "\\.") + pattern = strings.ReplaceAll(pattern, "*", ".*") + pattern = "^" + pattern + "$" + + // Простая проверка без regexp (более быстрая) + return matchSimplePattern(pattern, host) +} + +// Простая проверка паттерна (без использования regexp для скорости) +func matchSimplePattern(pattern, host string) bool { + // Убираем ^ и $ добавленные выше + pattern = strings.TrimPrefix(pattern, "^") + pattern = strings.TrimSuffix(pattern, "$") + + // Если паттерн = .* (любой хост) + if pattern == ".*" { + return true + } + + // Разбиваем паттерн на части по .* + parts := strings.Split(pattern, ".*") + + // Проверяем каждую часть + currentPos := 0 + for i, part := range parts { + if part == "" { + continue + } + + // Ищем часть в хосте начиная с текущей позиции + idx := strings.Index(host[currentPos:], part) + if idx == -1 { + return false + } + + // Для первой части проверяем что она в начале (если паттерн не начинается с *) + if i == 0 && !strings.HasPrefix(pattern, ".*") { + if idx != 0 { + return false + } + } + + // Для последней части проверяем что она в конце (если паттерн не кончается на *) + if i == len(parts)-1 && !strings.HasSuffix(pattern, ".*") { + if currentPos+idx+len(part) != len(host) { + return false + } + } + + currentPos += idx + len(part) + } + + return true +} + func Alias_check(r *http.Request) (alias_found bool, host string) { alias_found = false @@ -20,10 +84,10 @@ func Alias_check(r *http.Request) (alias_found bool, host string) { for _, alias := range site.Alias { - if alias == r.Host { + // Поддержка wildcard паттернов + if matchWildcardAlias(alias, r.Host) { alias_found = true return alias_found, site.Host - } else { alias_found = false } diff --git a/README.md b/README.md index ef91977..36a4597 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,29 @@ go build -o MyApp.exe - `Proxy_Service` - конфигурация прокси-сервисов - `Soft_Settings` - порты и хосты сервисов (MySQL, PHP, админка) +### 🌐 Alias с поддержкой Wildcard + +Для сайтов поддерживается wildcard (`*`) в алиасах: + +```json +{ + "alias": [ + "*.test.ru", // Все поддомены voxsel.ru + "*.test.com", // Все поддомены voxsel.com + "test.com", // Точное совпадение + "api.*" // api с любой зоной + ], + "host": "test.ru" +} +``` + +**Примеры работы wildcard:** +- `*.example.com` → `api.example.com`, `admin.example.com`, `test.example.com` ✅ +- `example.*` → `example.com`, `example.ru`, `example.org` ✅ +- `*example.com` → `test-example.com`, `my-example.com` ✅ +- `*` → любой домен ✅ (осторожно!) +- `example.com` → только `example.com` ✅ (без wildcard) + ### 🔄 Прокси-сервер Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы.