diff --git a/packages/app-console/src/views/storage/websites.vue b/packages/app-console/src/views/storage/websites.vue
index dac0c2c20d..9f0bfe5e4b 100644
--- a/packages/app-console/src/views/storage/websites.vue
+++ b/packages/app-console/src/views/storage/websites.vue
@@ -95,7 +95,7 @@
取消
-
+
确定
@@ -228,15 +228,26 @@ export default {
this.$refs.editForm.validate(async valid => {
if (!valid) return
+ const REGEX_DOMAIN = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/
+ if(REGEX_DOMAIN.test(this.editForm.domain) === false) {
+ showError('域名格式不正确')
+ return
+ }
+
const params = {
website_id: this.editForm._id,
domain: this.editForm.domain
}
+ this.loading = true
const ret = await websiteAPI.bindDomain(params)
+ .finally(() => this.loading = false)
- if (ret.code) {
- showError(ret.error)
- return
+ if (ret.code === 'DOMAIN_NOT_RESOLVEABLE') {
+ return showError('解析失败,请先对该域名做 CNAME 解析')
+ }
+
+ if(ret.code === 'DOMAIN_RESOLVED_ERROR') {
+ return showError('解析错误,请使用正确的 CNAME 解析值')
}
this.$notify({
diff --git a/packages/system-server/src/constants.ts b/packages/system-server/src/constants.ts
index 85cd485486..539b89a527 100644
--- a/packages/system-server/src/constants.ts
+++ b/packages/system-server/src/constants.ts
@@ -22,6 +22,7 @@ export const BUCKET_QUOTA_MIN = 1 * GB
/** regex const */
export const REGEX_BUCKET_NAME = /^[a-z0-9]{1,16}$/
+export const REGEX_DOMAIN = /^(?=^.{3,255}$)[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+$/
/** collection name of cloud functions published to app db */
export const CN_PUBLISHED_FUNCTIONS = '__published__functions'
diff --git a/packages/system-server/src/handler/website/domain-bind.ts b/packages/system-server/src/handler/website/domain-bind.ts
index 7e981617b2..fa4f5720b0 100644
--- a/packages/system-server/src/handler/website/domain-bind.ts
+++ b/packages/system-server/src/handler/website/domain-bind.ts
@@ -1,11 +1,12 @@
import { ObjectId } from "mongodb"
import * as dns from "node:dns"
-import { CN_WEBSITE_HOSTING } from "../../constants"
+import { CN_WEBSITE_HOSTING, REGEX_DOMAIN } from "../../constants"
import { Request, Response } from "express"
import { CONST_DICTS } from "../../constants"
import { checkPermission } from "../../support/permission"
import { IApplicationData } from "../../support/application"
import { DatabaseAgent } from "../../db"
+import { logger } from "../../support/logger"
// import { handleCheckDomain } from "./domain-check"
/**
@@ -15,8 +16,9 @@ export async function handleBindDomain(req: Request, res: Response) {
const db = DatabaseAgent.db
const app: IApplicationData = req["parsed-app"]
const uid = req["auth"]?.uid
- const { domain, website_id } = req.body
-
+ const website_id = req.body?.website_id
+ const domain = req.body?.domain || ''
+
// check login
if (!uid) {
res.status(401).send()
@@ -38,18 +40,19 @@ export async function handleBindDomain(req: Request, res: Response) {
}
// check domain
- if (!domain) {
+ if (REGEX_DOMAIN.test(domain) === false) {
return res.status(422).send("invalid domain")
}
// check domain is available
- const dnsPromise = dns.promises
- const result = await dnsPromise.resolveCname(domain as string).catch(() => {})
+ const resolver = new dns.promises.Resolver({ timeout: 3000, tries: 2 })
+ const result = await resolver.resolveCname(domain as string).catch(() => { })
if (!result) {
- return res.send({code: 'DOMAIN_NOT_RESOLVEABLE', error: 'domain is not resolveable'})
+ return res.send({ code: 'DOMAIN_NOT_RESOLVEABLE', error: 'domain is not resolveable' })
}
- if ((result || []).includes(website.cname)) {
- return res.send({code: 'DOMAIN_RESOLVED_ERROR', error: 'error resolved result got'})
+
+ if (false === (result || []).includes(website.cname)) {
+ return res.send({ code: 'DOMAIN_RESOLVED_ERROR', error: 'error resolved result got' })
}
// check if domain is already binded
diff --git a/packages/system-server/src/handler/website/website-create.ts b/packages/system-server/src/handler/website/website-create.ts
index 5bb3893b99..6b67970039 100644
--- a/packages/system-server/src/handler/website/website-create.ts
+++ b/packages/system-server/src/handler/website/website-create.ts
@@ -47,8 +47,8 @@ export async function handleCreateWebsite(req: Request, res: Response) {
// generate cname url for bucket and appid
const endpoint = new URL(Config.MINIO_CONFIG.endpoint.external)
- const { host } = endpoint
- const cname = `${app.appid}-${bucket}.${host}`
+ const { hostname } = endpoint
+ const cname = `${app.appid}-${bucket}.${hostname}`
// build website hosting data
const doc = {