【问题标题】:How to display non-SSL images on HTTPS connection?如何在 HTTPS 连接上显示非 SSL 图像?
【发布时间】:2009-04-19 17:41:42
【问题描述】:

在我的 https 网站上,如何在没有证书的情况下显示来自网站的图像?

我拥有以下示例域:

  • http://www.example.com
  • http://static.example.com(用于我的 CDN)

我拥有 www.example.com 的证书,但没有 static.example.com 的证书。

在我的 www.example.com 域上,您可以使用 httpS://www.example.com

通过 SSL 注册服务

在注册表单 (www.) 上,我想显示来自我的 CDN 的图像,该 CDN 在 http://static.example.com 上,但不拥有该子域的证书。

在 https://www.example.com 注册表单上 - 我正在使用 AJAX 从 http://static.example 动态提取图像.com。使用 AJAX 时,Web 浏览器似乎根本不显示非 SSL 图像。但是,如果该图像位于 httpS://www.example.com 域(与注册表单相同),则该图像将通过 AJAX 显示。

出于架构和设计的原因,我希望将这些图像保留在我的 CDN (static.example.com) 上,而无需购买证书。

有谁知道如何通过 AJAX 从我的 httpS://www.example 域上的非 SSL 子域显示这些图像?

提前致谢。

【问题讨论】:

    标签: ssl image https


    【解决方案1】:

    您可以制作自己的 ssl 代理。

    通过此脚本运行所有图像。 只需创建一个文件并将此 PHP 代码放入其中。使用curlfile_get_contents 回显内容。

    所以如果你想调用安全镜像,你可以这样调用它:

    https://mysecureserver.com/path_to_this_script/?url=[base64 encoded image link]

    <?php   
      $strFile = base64_decode(@$_GET['url']);
      $strFileExt = end(explode('.' , $strFile));
      if($strFileExt == 'jpg' or $strFileExt == 'jpeg'){
        header('Content-Type: image/jpeg');
      }elseif($strFileExt == 'png'){
        header('Content-Type: image/png');
      }elseif($strFileExt == 'gif'){
        header('Content-Type: image/gif');
      }else{
        die('not supported');
      }
      if($strFile != ''){
        $cache_ends = 60*60*24*365;
        header("Pragma: public");
        header("Cache-Control: maxage=". $cache_ends);
        header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $cache_ends).' GMT');
    
        //... [and get the content using curl or file_get_contents and echo it out ]
    
      }
      exit;
    ?>
    

    【讨论】:

    • 补充一点...我的服务器配置阻止了包含“==”的请求(因为它们经常用于恶意扫描活动)。 base64_encode 字符串通常以 '==' 结尾。这可以通过在创建时使用urlencode(base64_encode($url)) 来纠正,然后在上面的代码中使用base64_decode(urldecode(@$_GET['url']))
    • 这很好,但要注意这里的安全问题。确保只允许获取某些域的 url...也就是白名单域。
    • 对不起,但我想说这是质量差的代码。一般的方法可行且有意义,但是:从请求的 url 派生 mimetype 太可怕了!它应该来自实际加载的图像。更强大的是使用后端服务器发送的那些标头(包括内容类型标头)。那应该最清楚什么标题是合适的。
    • 请注意,这将完全破坏拥有 CDN 的意义,因为 CDN 的工作是为来自不同服务器的内容提供服务器,但此解决方案无论如何都会通过您的服务器。因此,您的服务器会将图像提供给 CDN,然后从 CDN 取回。因此,如果您这样做,那么只需停止 CDN 并从您的服务器提供静态内容,那么就没有 PHP 开销。
    • 如果 php_openssl 不可用或关闭和/或 allow_url_fopen 未打开,则使用 CURL,还实现 URL 中没有扩展名或 URL 中的扩展名后有某些内容的情况...
    【解决方案2】:

    如果没有 static.example.com 的证书,将无法在某些浏览器(尤其是 Internet Explorer)中触发安全警告或提示。

    GoDaddy 以 30 美元左右的价格出售 SSL 证书。我会说春天是为了一点点现金。

    【讨论】:

      【解决方案3】:

      就像你会包含一个 https 图像:

      <img src="http://www.google.com/intl/en_ALL/images/logo.gif" />
      

      不过,有些浏览器可能会向用户抱怨您正在为安全页面加载不安全的资源。对此你无能为力。

      【讨论】:

      • 使用 AJAX 时,浏览器没有机会抱怨,因为图像是动态加载的……相反,浏览器根本不显示图像。这是整个问题,有什么办法可以解决这种行为?
      • “完整的问题是什么”,嘿嘿……直到你完全改变它。
      • 但这并不安全。人们使用 ssl 的全部原因是隐私,发送 http 图片有什么意义?
      【解决方案4】:

      您必须使用 https:// 引用在通过 HTTPS 提供的页面上提供链接或嵌入(直接或通过 AJAX)的所有内容。

      解决第 3 方纯 HTTP 内容问题的一种方法是通过使用 HTTPS 的反向代理(可能在您的站点上或为此提供的服务)提供该内容。这样做可能会产生法律影响,具体取决于它是否被视为仅仅是代理或复制内容(可能类似于 Google 缓存的作用)。此外,通过这样做,您有效地保证了您以这种方式嵌入的内容。

      【讨论】:

        【解决方案5】:

        我知道这是一个非常古老的问题,但我想我还是会投入 0.02 美元。

        我假设http://static.example.com 的子域也是http://www.example.com 的子目录/文件夹(即http://www.example.com/static),就像现在大多数托管的情况一样。

        您可以对此进行更改,但浏览到 http://www.example.com/statichttps://www.example.com/static……您看到的页面是否与浏览到 http://static.example.com 时看到的页面相同

        如果是这样,您可以像这样输入图像……

        https://www.example.com/static/image.ext

        对于那些使用典型碎片托管的人来说,另一种可能性是使用许多托管服务提供商提供的共享证书。请咨询托管公司的支持。它们通常是这样的……

        https://host.hostcoserver.com/~user/dir/image.ext

        希望你们都觉得这很有用!

        【讨论】:

        • 最好在此处发布答案,而不是将访问者引导至博客文章,尤其是对于一个非常古老的问题。
        • 我编辑了问题以使用用户在博客文章中给出的答案并删除了外部链接。
        【解决方案6】:

        要扩展@Jaka Jančar's answer,您需要通过 AJAX 下载图像吗? 您可以将 AJAX 调用替换为:动态添加 IMG 元素。

        function load_image_instead_of_ajax_call(dom_parent_element,image_url) {
            var img = document.createElement('img');
            img.onload = your_success_callback_function;
            img.onerror = your_error_callback_function;
            img.src = image_url;
            dom_parent_element.appendChild(img);
        }
        

        这样,您的图像资源将被加载,并在成功/错误时进行适当的回调。

        某些浏览器可能会抱怨您的页面同时包含 http 和 https 内容,但这并不常见(这似乎在大多数浏览器中默认关闭)。

        【讨论】:

          【解决方案7】:

          我为我运行的本地新闻聚合器遇到了这个问题,我最终使用 PHP 的副本将图像拉到我的服务器上,然后通过 SSL 提供它们。

          http://php.net/manual/en/function.copy.php

          【讨论】:

            猜你喜欢
            • 2018-07-01
            • 2012-10-13
            • 2015-12-31
            • 1970-01-01
            • 2017-11-13
            • 2017-01-01
            • 2011-07-02
            • 1970-01-01
            • 2013-11-09
            相关资源
            最近更新 更多