同志们,是否遇到过这样的灵异事件:在一台服务器上部署了多个网站,其中网站 A 配置了 SSL 证书,而网站 B 只有 HTTP,或者只是域名B解析到这台服务器。结果当你尝试(或浏览器自动尝试)以 HTTPS 访问网站 B 时,浏览器里竟然显示出了网站 A 的内容,同时还伴随着刺眼的“您的连接不是私密连接”红色警告
。
这不是服务器中毒了,也不是 DNS 解析错了,这是 Web 服务器配置中非常经典的“HTTPS 默认站点回落”问题。今天我们就结合宝塔面板的实际案例,来聊聊这个问题的成因与解法。
1. 案发现场
假设你的服务器上有两个网站:
网站 A (www.a.com):部署了 SSL 证书,开启了 HTTPS。
网站 B (www.b.com):是个测试站,或者只是域名解析到这台服务器,没弄证书,只跑在 HTTP (80端口) 上;甚至是这台服务器的IP。
现象:当你访问 https://www.b.com 时:
浏览器地址栏显示的是 b.com。
页面内容加载的却是 网站 A 的首页。
浏览器提示“证书无效”(因为证书是发给 A 的,但你访问的是 B)。
2. 为什么会发生这种事?(核心原理)
这个问题的根源在于 Nginx(以及大多数 Web 服务器)处理请求的逻辑。
浏览器主动升级:现在的浏览器(Chrome, Edge 等)非常激进,即便你没配置 HTTPS,它有时也会尝试优先请求 HTTPS (443端口)。
端口监听:请求到达服务器的 443 端口。Nginx 开始工作。
寻找匹配:Nginx 会检查所有监听 443 端口的配置文件(server_name)。
匹配失败与回落:
Nginx 在 443 端口的配置里找 <www.b.com。
找不到! 因为网站 B 根本没配置 SSL,也没监听 443 端口。
兜底机制:根据 Nginx 规则,如果找不到匹配的域名,它会将请求交给“默认站点” (Default Server)处理。
在宝塔面板的配置逻辑中,通常第一个创建了 SSL 的站点(或者按字母排序靠前的站点),会被 Nginx 当作默认站点。
于是,请求的是 B,Nginx 却把 A 的内容返回给了你。这就造成了所谓的“窜站”。
3. 解决方案
根据实际需求,我们有两种标准的解决方案:
方案一:开启“HTTPS防窜站”(适合且仅适合 B 站确实不需要 HTTPS 的情况)
如果你确定网站 B 只需要 HTTP,不需要 HTTPS,那么可以通过配置拒绝掉非法的 HTTPS 请求。
操作方法: 打开宝塔面板 -> 【网站】 -> 点击有证书的那个网站(网站A) -> 【高级设置】 -> 开启**【HTTPS防窜站】**。
原理: 宝塔会在 Nginx 配置中自动添加一个优先级最高的“空白默认站点”。当有不明域名的 HTTPS 请求进来时,这个默认站点会直接拦截并返回 444(无响应)或 403(禁止访问),直接切断连接,不再转发给网站 A。
方案二:给所有网站都申请 SSL 证书(推荐方案)
在 2025 年的今天,HTTPS 已经是网站的标配。浏览器对 HTTP 越来越不友好,因此彻底解决问题的办法是顺应标准。
操作方法: 给网站 B 也申请并部署一个 SSL 证书(Let's Encrypt 免费证书即可)。
原理: 当你给网站 B 配置了证书后,Nginx 在 443 端口就能找到 server_name: www.b.com 的配置了。
效果: Nginx 精确匹配,不再走默认回落逻辑。用户访问 https://www.b.com 既安全,又能正确显示 B 站内容。
4. 总结
“串站”现象本质上是 Nginx 在找不到目标时的“热心帮忙”(把请求交给默认站点)。
如果你想省事,开启“HTTPS防窜站”,让错误的连接直接断开。
如果你想正规,给所有域名都加上 SSL,这是对用户体验和 SEO 最友好的做法。
希望这篇文章能帮你解开迷惑!
(注:本文灵感来源于宝塔论坛用户 vjexuk 的提问及大炮运维V587的解答https://www.bt.cn/bbs/thread-142956-1-1.html)






还没有评论,来说两句吧...