宝塔“强制https”无效是因为它只处理http→https跳转,不处理example.com→www.example.com跳转;必须通过重定向功能或nginx配置实现非www到www的301跳转,并确保ssl证书和域名管理同时包含两个域名。

宝塔里点“强制HTTPS”为什么没用?
因为“强制HTTPS”只管 http → https,不管 example.com → www.example.com。这两个是完全独立的跳转逻辑,宝塔不会自动合并处理。你开了强制HTTPS,但用户输 http://example.com,它会跳到 https://example.com,而不是你想要的 https://www.example.com——中间缺了“非www→www”这关键一跳。
常见错误现象:小绿锁有了,但地址栏还是裸域名;搜索引擎收录里同时存在两个版本,权重被稀释;CDN回源时因 Host 不一致报 400。
- 必须先确认你的 SSL 证书已包含
example.com和www.example.com两个域名(Let’s Encrypt 申请时要勾选两者) - 宝塔「网站」→「设置」→「域名管理」里,两个域名都得加进去,否则
example.com的请求根本进不到这个站点配置中 - “强制HTTPS”开关只是帮你加了一条
return 301 https://$host$request_uri;,它不改$host的值
用宝塔「重定向」功能一次性搞定 http+非www → https+www
新版宝塔(≥6.0)的「重定向测试版」是目前最稳、最直观的方式,支持组合条件,避免规则冲突。
- 入口路径:网站列表 → 点击目标站点「设置」→ 左侧菜单选「重定向测试版」
- 重定向类型选「域名」,填入
example.com(不带 http/https) - 目标URL填
https://www.example.com$request_uri($request_uri自动保留路径和参数) - 重定向方式选
301,勾选「启用」 - 保存后,再确保「SSL」选项卡里「强制HTTPS」也开着——这样
http://www.example.com就能跳到https://www.example.com
注意:不要同时开「强制HTTPS」+「重定向到 https://example.com」,否则会形成跳转链(http→https→https+www),可能触发浏览器重定向限制或 CDN 缓存异常。
手动写 Nginx 配置:精准控制跳转顺序和例外路径
当你需要排除某些路径(如 /.well-known/acme-challenge/)、适配多级子域名,或调试跳转失败时,直接改配置更透明。
进入网站「配置文件」选项卡,在 server 块监听 80 端口的部分顶部插入:
if ($host = 'example.com') {
return 301 https://www.example.com$request_uri;
}
这段代码必须放在 listen 80; 对应的 server 块里,且不能嵌套在其他 location 中。它优先于后续所有规则执行。
-
$host是请求头里的 Host 字段,区分大小写,匹配精确(不带协议) - 如果还想让
http://www.example.com也跳一次 https,就在同一 server 块里再加一行:if ($scheme = http) { return 301 https://$host$request_uri; } - 别把这两条 if 写反顺序,否则
example.com请求会先被$scheme拦住,跳去https://example.com,绕过了 www 跳转
为什么不能只靠 .htaccess 或 PHP 跳转?
Apache 的 .htaccess 或 PHP 入口判断(如 $_SERVER['HTTPS'] != 'on')确实能实现跳转,但它们发生在应用层,比 Nginx 的 server 级跳转慢一拍,且无法解决 Host 头不一致带来的问题。
- PHP 跳转会多一次 PHP 解析开销,对高并发不友好
- .htaccess 在 Apache 下生效,但若你用了 CDN 或前置 Nginx,请求可能根本没进 Apache,规则就失效了
- 更重要的是:这些方式无法干预 TLS 握手前的行为,比如当用户直接访问
http://example.com时,Nginx 还没把请求交给 Apache/PHP,就已经该决定跳哪了
真正可靠的跳转,得在 Web 服务器最早能拿到请求信息的地方做——也就是 Nginx 的 server 块或宝塔的重定向模块。










