Alias WildCard
Возможность добавлять Alias по маске WildCard
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
23
README.md
23
README.md
@@ -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)
|
||||||
|
|
||||||
### 🔄 Прокси-сервер
|
### 🔄 Прокси-сервер
|
||||||
|
|
||||||
Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы.
|
Прокси-сервер позволяет перенаправлять внешние запросы на локальные сервисы.
|
||||||
|
Reference in New Issue
Block a user