iframe在某些浏览器中正确加载网页,但在其他浏览器中不正确加载(不安全内容错误)

iframe在某些浏览器中正确加载网页,但在其他浏览器中不正确加载(不安全内容错误),iframe,https,content-security-policy,Iframe,Https,Content Security Policy,我有一个https网站,它试图在iframe中显示外部https网页 在Chrome和Firefox桌面版上,它可以正常加载 在桌面/移动Safari和移动Chrome for iOS上,它不加载任何内容 在Safari中,我看到了错误: The page at about:blank was not allowed to display insecure content from http://example.com 尽管iframe加载的网页是https,但它似乎试图加载的内容是http,

我有一个https网站,它试图在iframe中显示外部https网页

在Chrome和Firefox桌面版上,它可以正常加载

在桌面/移动Safari和移动Chrome for iOS上,它不加载任何内容

在Safari中,我看到了错误:

The page at about:blank was not allowed to display insecure content from http://example.com
尽管iframe加载的网页是https,但它似乎试图加载的内容是http,并阻止了iframe加载任何内容

我真的很困惑,因为它适用于某些浏览器,但不适用于其他浏览器。以下是我运行的浏览器测试

Desktop Chrome: Success
Desktop Firefox: Success
Desktop Safari: Fail
iOS Mobile Safari: Fail
iOS Mobile Chrome: Fail
Android Mobile Chrome: Success
以前有没有人遇到过这个错误,并且知道如何避免它?为什么它在某些浏览器中工作,而在其他浏览器中不工作?我正在努力通过使用iframe实现跨浏览器兼容性。如果您对黑客或解决方法有任何建议,我们将不胜感激

更新: 查看“网络”选项卡后。我看到它正在请求一个HTTPS url,但该位置是一个HTTP url。一些浏览器对此没有问题,可以显示内容。其他浏览器似乎阻止了它。尽管位置url显示http,但请求url实际上打开了一个https网站。

问题是混合内容,这是在加载HTTP和HTTPS内容时出现的

您必须问自己的第一个问题是,大多数开发人员都没有做到这一点:这值得吗

假设是这样的话,你必须要有创造力。基本上,您必须让您的
iframe
从您自己的站点加载页面,并让它加载非HTTPS页面。这还意味着必须扫描HTML/XML属性,如
src
,并重新构建它们的URL(不要忘记
base
元素),以便通过站点提供这些图像



Is
http://example.com
实际的错误消息是什么?iFrame试图从
http://example.com
?此外,当您打开开发工具时,Chrome版本是否也尝试从
http://example.com
当检查
网络
选项卡号时,实际的网站具有不同的url。我改为“榜样”,因为它不重要。但查看“网络”选项卡确实提供了一些见解。看看这个截图。显然,它正在请求HTTPS url,但位置是HTTP url。Chrome和Firefox对此没有问题,但其他浏览器则不然。知道为什么吗?值得一提的是,如果您打开请求url,它实际上会打开一个HTTPS站点。它看起来像一个重定向。
302(对象移动)
的HTTP响应强制浏览器加载HTTP站点,如
Location
标题中所列。查看“网络”选项卡,第一个链接在到达正确的
200
响应代码之前似乎重定向了3次。如果您可以访问调用第一个URL的任何内容,请将其更改为仅调用最终URL。不幸的是,我无法访问URL。您知道为什么有些浏览器可以在iframe中显示网站,但其他浏览器却阻止了它吗?请尝试将属性设置为
无引用者
<代码>
<?php
if (isset($_GET['url']))
{
 $url = $_GET['url'];
 $ch = curl_init();
 $timeout = 5;
 curl_setopt($ch, CURLOPT_URL, $url);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
 $data = curl_exec($ch);
 curl_close($ch);
 echo $data;
}
?>