You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理用户输入域名,生成含www的双域名参数用于Certbot申请证书

解决Certbot同时申请主域名与www子域名SSL证书的Shell脚本问题

我明白你的需求:不管输入的域名是带www.前缀还是不带,最终都要生成同时包含主域名和对应www子域名的-d参数——比如输入domain.com或www.domain.com,都要输出-d domain.com -d www.domain.com。

你的原始脚本只是直接遍历server_names里的域名添加-d,没有处理每个域名的双向覆盖,所以达不到预期效果。下面是修正后的脚本,同时解决了重复域名的问题:

# 初始化数组存储所有要申请的域名
lets_domains=()

if [ ! -z "${server_names}" ]; then
    for i in ${server_names}
    do
        # 提取不带www.前缀的主域名
        main_domain="${i#www.}"
        # 将主域名和www.主域名加入数组
        lets_domains+=("$main_domain")
        lets_domains+=("www.$main_domain")
    done

    # 去重并转换为-d 参数格式
    # sort -u 去重,sed 去掉开头多余的空格
    letsdomain=$(printf " -d %s" "${lets_domains[@]}" | sort -u | sed 's/^ //')
fi

脚本说明:

  1. 提取主域名:使用Shell的参数扩展${i#www.},自动去掉域名开头的www.——如果输入的是www.example.com,得到example.com;如果输入的是example.com,结果还是example.com。
  2. 覆盖双向域名:不管输入的域名带不带www.,都会同时将主域名和www.前缀的子域名加入数组,确保证书覆盖两种访问形式。
  3. 去重处理:通过sort -u去除数组中重复的域名(比如如果server_names同时包含example.com和www.example.com,不会重复生成-d参数)。
  4. 格式转换:用printf将数组元素转换为-d 域名的格式,最后用sed去掉开头的多余空格,保证参数格式正确。

后续Certbot命令示例:

echo "Starting create Let's Encrypt SSL Certificate..."
/bin/certbot certonly --email ${email} --webroot -w /var/www/html ${letsdomain}

(这里假设你用webroot插件,你可以根据实际需求替换成其他插件,比如--standalone)

内容的提问来源于stack exchange,提问作者jazzi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:18:02