从 HTTP 到 HTTPS:证书部署与代理访问排查记录
站点最初只通过 IP 访问,开启代理后有时返回 404,不开代理反而正常。这个现象把两个问题混在了一起:Nginx 根据 Host 选择虚拟主机,而代理规则可能让裸 IP 走不同出口;同时 Halo 的外部地址仍是 HTTP,登录跳转和资源链接不稳定。最终处理方式不是继续为 IP 打补丁,而是固定域名、配置 HTTPS,并让应用与代理对同一个公开地址达成一致。
先确认请求到了谁
使用 curl -v 分别请求 IP、域名和指定 Host,记录解析地址、TLS 握手、响应头与服务器标识。Nginx 的 404 说明请求已经到服务器,只是没有匹配目标站点或目标 location,不等同于服务离线。
排查顺序是 DNS、代理分流、80/443 监听、虚拟主机 server_name、upstream、Halo 外部 URL。每层只问一个问题。Clash 侧优先让私有地址和目标域名按需要直连,并避免用浏览器缓存结果判断网络状态。
证书部署
域名的 A 记录指向服务器后,先确保 80 端口可从公网访问,再通过 ACME 客户端申请包含根域名和 www 的证书。Nginx 配置由工具生成前先备份,运行 nginx -t 后才重载。
server {
listen 80;
server_name maomao.autos www.maomao.autos;
return 301 https://$host$request_uri;
}
HTTPS 虚拟主机加载完整证书链和私钥,将请求代理到 Halo,并转发 Host、X-Forwarded-For、X-Forwarded-Proto。Halo 的公开 URL 设置为最终 HTTPS 地址,避免后台生成 HTTP 链接。
续期需要真实演练
安装定时续期任务后执行 dry-run,确认挑战路径、账户和重载钩子都有效。证书文件权限只允许必要服务读取,私钥不进入备份日志。监控不只看证书是否存在,还要检查剩余天数与公网实际返回的证书。
外部验证矩阵
- [x]
http://maomao.autos/永久跳转到 HTTPS - [x] 根域名与
www均在证书 SAN 中 - [x] TLS 主机名校验与证书链验证通过
- [x] 首页、文章、后台登录和静态资源均无混合内容
- [x] 代理开启与关闭时域名行为一致
- [x] Halo 生成的 canonical 与登录回调使用 HTTPS
- [x] 自动续期 dry-run 完成,Nginx 重载钩子有效
关于裸 IP 的取舍
HTTPS 证书绑定域名,裸 IP 也无法表达站点的稳定身份。可以让默认虚拟主机把 IP 请求跳转到域名,但正式链接、书签和应用配置都应使用 https://maomao.autos/。代理规则变化时,域名还可以通过 DNS 与分流策略明确控制。
这次调整的关键不是“多一个小锁图标”,而是统一站点身份:DNS 指向服务器,Nginx 按域名路由,证书证明域名,Halo 生成同一公开地址。四层一致之后,许多看似随机的跳转、404 和资源问题自然消失。
评论区