mirror of
https://github.com/1Panel-dev/1Panel.git
synced 2025-01-31 22:18:07 +08:00
feat: 网站支持中文域名 (#3472)
Refs https://github.com/1Panel-dev/1Panel/issues/1522
This commit is contained in:
parent
9ae5592d2b
commit
ebfaf77c8f
@ -9,6 +9,7 @@ import (
|
|||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/1Panel-dev/1Panel/backend/utils/common"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"reflect"
|
"reflect"
|
||||||
@ -172,8 +173,14 @@ func (w WebsiteService) GetWebsites() ([]response.WebsiteDTO, error) {
|
|||||||
func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) {
|
func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error) {
|
||||||
primaryDomainArray := strings.Split(create.PrimaryDomain, ":")
|
primaryDomainArray := strings.Split(create.PrimaryDomain, ":")
|
||||||
primaryDomain := primaryDomainArray[0]
|
primaryDomain := primaryDomainArray[0]
|
||||||
|
alias := create.Alias
|
||||||
if exist, _ := websiteRepo.GetBy(websiteRepo.WithAlias(create.Alias)); len(exist) > 0 {
|
if common.ContainsChinese(alias) {
|
||||||
|
alias, err = common.PunycodeEncode(alias)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if exist, _ := websiteRepo.GetBy(websiteRepo.WithAlias(alias)); len(exist) > 0 {
|
||||||
return buserr.New(constant.ErrAliasIsExist)
|
return buserr.New(constant.ErrAliasIsExist)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -201,7 +208,7 @@ func (w WebsiteService) CreateWebsite(create request.WebsiteCreate) (err error)
|
|||||||
website := &model.Website{
|
website := &model.Website{
|
||||||
PrimaryDomain: primaryDomain,
|
PrimaryDomain: primaryDomain,
|
||||||
Type: create.Type,
|
Type: create.Type,
|
||||||
Alias: create.Alias,
|
Alias: alias,
|
||||||
Remark: create.Remark,
|
Remark: create.Remark,
|
||||||
Status: constant.WebRunning,
|
Status: constant.WebRunning,
|
||||||
ExpireDate: defaultDate,
|
ExpireDate: defaultDate,
|
||||||
|
@ -30,27 +30,44 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func getDomain(domainStr string, defaultPort int) (model.WebsiteDomain, error) {
|
func getDomain(domainStr string, defaultPort int) (model.WebsiteDomain, error) {
|
||||||
domain := model.WebsiteDomain{}
|
var (
|
||||||
|
err error
|
||||||
|
domain = model.WebsiteDomain{}
|
||||||
|
portN int
|
||||||
|
)
|
||||||
domainArray := strings.Split(domainStr, ":")
|
domainArray := strings.Split(domainStr, ":")
|
||||||
if len(domainArray) == 1 {
|
if len(domainArray) == 1 {
|
||||||
domain.Domain = domainArray[0]
|
domain.Domain, err = handleChineseDomain(domainArray[0])
|
||||||
|
if err != nil {
|
||||||
|
return domain, err
|
||||||
|
}
|
||||||
domain.Port = defaultPort
|
domain.Port = defaultPort
|
||||||
return domain, nil
|
return domain, nil
|
||||||
}
|
}
|
||||||
if len(domainArray) > 1 {
|
if len(domainArray) > 1 {
|
||||||
domain.Domain = domainArray[0]
|
domain.Domain, err = handleChineseDomain(domainArray[0])
|
||||||
portStr := domainArray[1]
|
|
||||||
portN, err := strconv.Atoi(portStr)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return model.WebsiteDomain{}, buserr.WithName("ErrTypePort", portStr)
|
return domain, err
|
||||||
|
}
|
||||||
|
portStr := domainArray[1]
|
||||||
|
portN, err = strconv.Atoi(portStr)
|
||||||
|
if err != nil {
|
||||||
|
return domain, buserr.WithName("ErrTypePort", portStr)
|
||||||
}
|
}
|
||||||
if portN <= 0 || portN > 65535 {
|
if portN <= 0 || portN > 65535 {
|
||||||
return model.WebsiteDomain{}, buserr.New("ErrTypePortRange")
|
return domain, buserr.New("ErrTypePortRange")
|
||||||
}
|
}
|
||||||
domain.Port = portN
|
domain.Port = portN
|
||||||
return domain, nil
|
return domain, nil
|
||||||
}
|
}
|
||||||
return model.WebsiteDomain{}, nil
|
return domain, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleChineseDomain(domain string) (string, error) {
|
||||||
|
if common.ContainsChinese(domain) {
|
||||||
|
return common.PunycodeEncode(domain)
|
||||||
|
}
|
||||||
|
return domain, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createIndexFile(website *model.Website, runtime *model.Runtime) error {
|
func createIndexFile(website *model.Website, runtime *model.Runtime) error {
|
||||||
|
@ -3,6 +3,7 @@ package common
|
|||||||
import (
|
import (
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"golang.org/x/net/idna"
|
||||||
"io"
|
"io"
|
||||||
mathRand "math/rand"
|
mathRand "math/rand"
|
||||||
"net"
|
"net"
|
||||||
@ -12,9 +13,9 @@ import (
|
|||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
"unicode"
|
||||||
|
|
||||||
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
|
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
|
||||||
"github.com/mozillazg/go-pinyin"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func CompareVersion(version1, version2 string) bool {
|
func CompareVersion(version1, version2 string) bool {
|
||||||
@ -216,20 +217,6 @@ func LoadTimeZoneByCmd() string {
|
|||||||
return fields[2]
|
return fields[2]
|
||||||
}
|
}
|
||||||
|
|
||||||
func ConvertToPinyin(text string) string {
|
|
||||||
args := pinyin.NewArgs()
|
|
||||||
args.Fallback = func(r rune, a pinyin.Args) []string {
|
|
||||||
return []string{string(r)}
|
|
||||||
}
|
|
||||||
p := pinyin.Pinyin(text, args)
|
|
||||||
var strArr []string
|
|
||||||
for i := 0; i < len(p); i++ {
|
|
||||||
strArr = append(strArr, strings.Join(p[i], ""))
|
|
||||||
}
|
|
||||||
|
|
||||||
return strings.Join(strArr, "")
|
|
||||||
}
|
|
||||||
|
|
||||||
func IsValidDomain(domain string) bool {
|
func IsValidDomain(domain string) bool {
|
||||||
pattern := `^([\w\p{Han}\-\*]{1,100}\.){1,10}([\w\p{Han}\-]{1,24}|[\w\p{Han}\-]{1,24}\.[\w\p{Han}\-]{1,24})(:\d{1,5})?$`
|
pattern := `^([\w\p{Han}\-\*]{1,100}\.){1,10}([\w\p{Han}\-]{1,24}|[\w\p{Han}\-]{1,24}\.[\w\p{Han}\-]{1,24})(:\d{1,5})?$`
|
||||||
match, err := regexp.MatchString(pattern, domain)
|
match, err := regexp.MatchString(pattern, domain)
|
||||||
@ -238,3 +225,21 @@ func IsValidDomain(domain string) bool {
|
|||||||
}
|
}
|
||||||
return match
|
return match
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ContainsChinese(text string) bool {
|
||||||
|
for _, char := range text {
|
||||||
|
if unicode.Is(unicode.Han, char) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func PunycodeEncode(text string) (string, error) {
|
||||||
|
encoder := idna.New()
|
||||||
|
ascii, err := encoder.ToASCII(text)
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
return ascii, nil
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user