mirror of
				https://github.com/TeaOSLab/EdgeCommon.git
				synced 2025-11-04 05:00:24 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			93 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package configutils
 | 
						||
 | 
						||
import (
 | 
						||
	"github.com/iwind/TeaGo/logs"
 | 
						||
	"github.com/iwind/TeaGo/utils/string"
 | 
						||
	"strings"
 | 
						||
)
 | 
						||
 | 
						||
// MatchDomains 从一组规则中匹配域名
 | 
						||
// 支持的格式:example.com, www.example.com, .example.com, *.example.com, ~(\d+).example.com
 | 
						||
// 更多参考:http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name
 | 
						||
func MatchDomains(patterns []string, domain string) (isMatched bool) {
 | 
						||
	if len(patterns) == 0 {
 | 
						||
		return
 | 
						||
	}
 | 
						||
	for _, pattern := range patterns {
 | 
						||
		if MatchDomain(pattern, domain) {
 | 
						||
			return true
 | 
						||
		}
 | 
						||
	}
 | 
						||
	return
 | 
						||
}
 | 
						||
 | 
						||
// MatchDomain 匹配单个域名规则
 | 
						||
func MatchDomain(pattern string, domain string) (isMatched bool) {
 | 
						||
	if len(pattern) == 0 {
 | 
						||
		return
 | 
						||
	}
 | 
						||
 | 
						||
	if pattern == domain {
 | 
						||
		return true
 | 
						||
	}
 | 
						||
 | 
						||
	if pattern == "*" {
 | 
						||
		return true
 | 
						||
	}
 | 
						||
 | 
						||
	// 正则表达式
 | 
						||
	if pattern[0] == '~' {
 | 
						||
		reg, err := stringutil.RegexpCompile(strings.TrimSpace(pattern[1:]))
 | 
						||
		if err != nil {
 | 
						||
			logs.Error(err)
 | 
						||
			return false
 | 
						||
		}
 | 
						||
		return reg.MatchString(domain)
 | 
						||
	}
 | 
						||
 | 
						||
	if pattern[0] == '.' {
 | 
						||
		return strings.HasSuffix(domain, pattern)
 | 
						||
	}
 | 
						||
 | 
						||
	// 其他匹配
 | 
						||
	var patternPieces = strings.Split(pattern, ".")
 | 
						||
	var domainPieces = strings.Split(domain, ".")
 | 
						||
	if len(patternPieces) != len(domainPieces) {
 | 
						||
		return
 | 
						||
	}
 | 
						||
	isMatched = true
 | 
						||
	for index, patternPiece := range patternPieces {
 | 
						||
		if patternPiece == "" || patternPiece == "*" || patternPiece == domainPieces[index] {
 | 
						||
			continue
 | 
						||
		}
 | 
						||
		if strings.HasSuffix(patternPiece, ":*") {
 | 
						||
			var portIndex = strings.LastIndex(patternPiece, ":*")
 | 
						||
			if portIndex >= 0 {
 | 
						||
				var prefix = patternPiece[:portIndex]
 | 
						||
				if strings.HasPrefix(domainPieces[index], prefix+":") || domainPieces[index] == prefix {
 | 
						||
					continue
 | 
						||
				}
 | 
						||
			}
 | 
						||
		}
 | 
						||
		isMatched = false
 | 
						||
		break
 | 
						||
	}
 | 
						||
	return isMatched
 | 
						||
}
 | 
						||
 | 
						||
// IsFuzzyDomain 判断是否为特殊域名
 | 
						||
func IsFuzzyDomain(domain string) bool {
 | 
						||
	if len(domain) == 0 {
 | 
						||
		return true
 | 
						||
	}
 | 
						||
	if domain[0] == '.' || domain[0] == '~' {
 | 
						||
		return true
 | 
						||
	}
 | 
						||
	for _, c := range domain {
 | 
						||
		if c == '*' {
 | 
						||
			return true
 | 
						||
		}
 | 
						||
	}
 | 
						||
	return false
 | 
						||
}
 |