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.com
和 www.example.com
。只要您在证书请求中指定了两个域,大多数证书颁发机构都会为他们颁发的任何 SSL 证书免费提供此功能。 (如果您需要这方面的更多信息,请告诉我。)
更直接地回答您的问题:不,由于协议的工作方式,您无法绕过证书检查,这是故意的行为。另见 this answer。
我正在尝试将用户从 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.com
和 www.example.com
。只要您在证书请求中指定了两个域,大多数证书颁发机构都会为他们颁发的任何 SSL 证书免费提供此功能。 (如果您需要这方面的更多信息,请告诉我。)
更直接地回答您的问题:不,由于协议的工作方式,您无法绕过证书检查,这是故意的行为。另见 this answer。