Firefox 无法正确地从 HTTP 重定向到 HTTPS?

Firefox won't redirect from HTTP to HTTPS properly?

我正在尝试将用户从 https://www.example.com 重定向到 https://example.com(因为 SSL 证书仅对后者有效),这在使用此代码的 Chrome 中效果很好:

if(isset($_SERVER['HTTPS']) and $_SERVER['SERVER_PORT'] == 443){
    // We are on https version
    if(strtolower($_SERVER['SERVER_NAME']) == 'www.example.com'){
        // Wrong domain: Redirect to safety
        header('Location: https://example.com/', true, 301);
        exit();
    }else{
        // We are safe
        die('SSL certificate OK: Your credit card is now safe');
    }

}else{
    // Redirect to safety
    header('Location: https://example.com/', true, 301);
    exit();
}

然而,Firefox 拒绝重定向,它一直显示通常的 不安全站点:现在离开此页面,否则您的信用卡将被盗,等等。 警告,仅此而已。是否有一些解决方法可以强制此 Firefox 首先重定向然后检查 SSL 证书,就像 Chrome 已经做的那样?

注意:我没有使用 IIS,所以我不需要检查 $_SERVER['HTTPS'] 的值,它按原样工作。

您一直 运行 与无效证书错误冲突的原因是由于 HTTPS 的工作方式。即,HTTP 连接通过 TLS 隧道传输。这意味着客户端在到达发生重定向的 HTTP 层之前启动与 Web 服务器的 TLS 连接(包括验证服务器证书的过程)。结果是浏览器永远看不到您的重定向,因为 Firefox 在 Web 服务器可以响应证书之前阻塞了证书。

有一些方法可以在完成 TLS 握手之前处理 Host header,通常涉及 SNI,但这仍然需要来自服务器的有效证书,所以不需要真的帮到你了。

但是,可以为您的域使用对 "www" 前缀也有效的证书,例如example.comwww.example.com。只要您在证书请求中指定了两个域,大多数证书颁发机构都会为他们颁发的任何 SSL 证书免费提供此功能。 (如果您需要这方面的更多信息,请告诉我。)

更直接地回答您的问题:不,由于协议的工作方式,您无法绕过证书检查,这是故意的行为。另见 this answer