Golang匹配域名通配符

阿杰:

我有主机名白名单地图

var hostnameWhitelist = map[string] bool { "test.mydomain.com":true, "test12.mydomaindev.com":true}

我检查传入请求的主机名是否被允许的方式是-

    url, errURL := url.Parse("test.mydomain.com")
    if errURL != nil {
        fmt.Println("error during parsing URL")
        return false
    }
    fmt.Println("HOSTNAME = " + url.Hostname())

    if ok := hostnameWhitelist[url.Hostname()]; ok {
        fmt.Println("valid domain, allow access")
    } else {
        fmt.Println("NOT valid domain")
        return false
    }

虽然效果很好,但如何进行通配符匹配-

*.mydomain.com 
*.mydomaindev.com 

这两个都应该通过。

而,

*.test.com
*.hello.com

应该失败

大卫 :

正则表达式是解决您的问题的解决方案,因为您尝试将正则表达式与单个值匹配,所以map [string] bool可能无法按预期工作。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    if matched, _ := regexp.MatchString(".*\\.?mydomain.*", "mydomaindev.com"); matched {
        fmt.Println("Valid domain")
    }
}

这将匹配所有使用模式mydomain的域,因此www.mydomain.com www.mydomaindev.com将匹配byt test.com,hello.com将失败

其他方便的字符串操作是,

//This would match a.mydomain.com, b.mydomain.com etc.,
if strings.HasSuffix(url1.Hostname(), ".mydomain.com") {
    fmt.Println("Valid domain allow access")
}

//To match anything with mydomain - like mydomain.com, mydomaindev.com
if strings.Contains(url2.Hostname(), "mydomain.com") {
    fmt.Println("Valid domain allow access")
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章