如何处理用户输入域名,生成含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
脚本说明:
- 提取主域名:使用Shell的参数扩展
${i#www.},自动去掉域名开头的www.——如果输入的是www.example.com,得到example.com;如果输入的是example.com,结果还是example.com。 - 覆盖双向域名:不管输入的域名带不带
www.,都会同时将主域名和www.前缀的子域名加入数组,确保证书覆盖两种访问形式。 - 去重处理:通过
sort -u去除数组中重复的域名(比如如果server_names同时包含example.com和www.example.com,不会重复生成-d参数)。 - 格式转换:用
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
相关产品推荐
相关产品推荐

