Alias WildCard

Возможность добавлять Alias по маске WildCard
This commit is contained in:
2025-10-03 01:59:56 +07:00
parent d11834da37
commit 752f294392
2 changed files with 89 additions and 2 deletions

View File

@@ -12,6 +12,70 @@ func StartHandler() {
http.HandleFunc("/", handler) 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) { func Alias_check(r *http.Request) (alias_found bool, host string) {
alias_found = false alias_found = false
@@ -20,10 +84,10 @@ func Alias_check(r *http.Request) (alias_found bool, host string) {
for _, alias := range site.Alias { for _, alias := range site.Alias {
if alias == r.Host { // Поддержка wildcard паттернов
if matchWildcardAlias(alias, r.Host) {
alias_found = true alias_found = true
return alias_found, site.Host return alias_found, site.Host
} else { } else {
alias_found = false alias_found = false
} }

View File

@@ -106,6 +106,29 @@ go build -o MyApp.exe
- `Proxy_Service` - конфигурация прокси-сервисов - `Proxy_Service` - конфигурация прокси-сервисов
- `Soft_Settings` - порты и хосты сервисов (MySQL, PHP, админка) - `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)
### 🔄 Прокси-сервер ### 🔄 Прокси-сервер
Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы. Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы.