必须排除.well-known目录的HTTPS重定向,因其会干扰Let’s Encrypt的HTTP-01验证;应在Nginx 80端口server块中用if+set变量精准控制跳转开关,或显式配置location ^~ /.well-known/acme-challenge/放行。

80端口重定向是自动化续期中最隐蔽也最常被忽略的问题之一。它不会报错,也不会拒绝连接,而是悄悄把 Let’s Encrypt 的验证请求(http://域名/.well-known/acme-challenge/xxx)301 或 302 重定向到 HTTPS 或其他路径,导致 ACME 服务收不到预期的 challenge 响应,最终判定验证失败。
检查是否真正在发生重定向
别只看浏览器访问首页有没有跳转——要专门测试验证路径:
- 在服务器本地执行:
curl -I http://yourdomain.com/.well-known/acme-challenge/test,观察返回状态码。若出现301 Moved Permanently或302 Found,就已中招 - 用公网机器(如另一台云服务器)同样测试,排除本地 hosts 或缓存干扰
- 对比
curl -I http://yourdomain.com/和curl -I http://yourdomain.com/.well-known/的响应头,确认重定向是否针对整个域名或特定路径
常见重定向来源及关闭方式
重定向往往来自多层配置叠加,需逐层排查:
-
Nginx 主配置或全局规则:检查
/www/server/nginx/conf/nginx.conf或/etc/nginx/nginx.conf中是否存在return 301 https://$host$request_uri;类规则,尤其注意是否写在server { listen 80; ... }块顶部,未加 location 限定 -
站点配置中的强制跳转:进入宝塔 → 网站 → 设置 → 配置文件,查找
if ($scheme = http) { return 301 https://$host$request_uri; }或类似 rewrite,把它移到location /外、但用location ^~ /.well-known/显式放行 - 伪静态规则误伤:宝塔「伪静态」选项卡里若启用了 WordPress、ThinkPHP 等模板,部分模板自带全站 HTTP→HTTPS 跳转,需手动删掉或注释掉相关行
- CDN 层自动 HTTPS:Cloudflare 的 “Always Use HTTPS”、阿里云 CDN 的“强制跳转 HTTPS”功能,会拦截并重写所有 HTTP 请求,必须临时关闭
安全放行验证路径的推荐写法
不建议关掉全部跳转,而是精准豁免 .well-known 路径。在站点 Nginx 配置中加入以下标准段(放在 server 块内、其他 rewrite 之前):
default_type "text/plain";
root /www/wwwroot/your-site;
# 不做任何重定向,不走 proxy_pass,不触发 rewrite
}
注意:root 必须指向你站点实际的根目录(不是 Nginx 默认 html),且确保该路径下能真实生成 .well-known/acme-challenge/ 文件(可手动建个 test.txt 验证是否可访问)。
验证通过后再恢复跳转的实操节奏
续签不是一锤子买卖,而是有节奏的操作:
- 先停用所有层级的 HTTP→HTTPS 跳转(Nginx、CDN、伪静态)
- 执行一次强制续签(宝塔点「续签」或终端运行
acme.sh --renew -d yourdomain.com) - 成功后立即检查证书文件更新时间:
ls -l /www/server/panel/vhost/cert/yourdomain.com/ - 确认新证书已写入,再逐层恢复跳转配置,并重启 Nginx(
bt 7) - 最后用
curl -I http://yourdomain.com/确认跳转恢复,同时再次测试/.well-known/返回 404(表示路径存在但无文件,属正常)










