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

标签 iframe https content-security-policy

我有一个 https 网站,它试图在 iframe 中显示外部 https 网页。
在桌面版 Chrome 和 Firefox 上,它可以正常加载。
在适用于 iOS 的桌面/移动 Safari 和移动 Chrome 上,它不会加载任何内容。
在 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 网址,但该位置是一个 HTTP 网址。一些浏览器对此没有问题并显示内容。其他浏览器似乎阻止了它。即使位置 url 显示 http,请求 url 实际上确实打开了一个 https 网站。
network dev tools

最佳答案

问题是混合内容,即在您加载 HTTP 和 HTTPS 内容时。
您必须问自己的第一个问题是大多数开发人员未能做到的:这值得做吗?
假设你必须要有创意。你基本上必须有你的iframe从您自己的站点加载页面并让它加载非 HTTPS 页面。这也意味着必须扫描 HTML/XML 属性,例如 src。并重建它们的 URL(不要忘记 base 元素),以便通过您的站点提供这些图像。

<?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;
}
?>

关于iframe 在某些浏览器中正确加载网页,但在其他浏览器中不正确(不安全的内容错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64921494/

相关文章:

google-chrome-extension - Firebase + Chrome内容安全策略设置?

iframe - iframe 对页面的影响中的无索引漫游器元标记

javascript - html2canvas.js 无法在 IE9/10/11 中工作

php - 如何在 Symfony 4 本地 Web 服务器上启用 HTTPS

perl - 我可以强制 LWP::UserAgent 接受过期的 SSL 证书吗?

apache - 在 apache 中,如果我转到 https ://example. com,所有图像/链接都是 http ://. 有没有办法自动重写 html,所以它都是 https ://?

Javascript 和 CSP - 最佳实践

javascript - ng-csp 指令的性能影响

jquery - 在 Javascript 中设置 iframe `src` 会在 Internet Explorer 中引发 'Permission Denied' 错误

javascript - 使用 Google Caja 运行用户提供的 Javascript