【问题标题】:Http content loaded in https connectionhttps 连接中加载的 Http 内容
【发布时间】:2014-10-31 19:35:05
【问题描述】:

我的 Webapp 使用 https 连接/ssl 证书运行。我需要向用户展示图片。我通过 API 请求获取图片的链接,然后将它们链接起来。可惜图片地址是http,所以浏览器显示网站有不安全的部分,应该不是……

之后我可以下载图片并链接到正确的图片,但我认为这可能会有点耗时,而且不是最好的处理方式。

有人知道更好的解决方案吗?我正在使用 php、jquery 和 javascript。

【问题讨论】:

  • 您的问题中没有足够的信息来给出答案。哪个API?您不能将http:// 更改为https://,为什么不呢?图片是否在外部资源上?
  • 亚马逊 MWS ListMatchingProducts
  • 如果我将 http:// 更改为 https:// 它根本不会显示任何图片。图片存储在亚马逊的服务器上
  • 如果图像是外部的,并且您无法获得安全链接,那么您必须使用 PHP 在后台下载它们,并在您的服务器上提供指向它们的安全链接。更好的是:制作一个脚本,将图像流式传输,就好像它是本地的一样,并且在安全链接上。我不能举个例子,因为我对亚马逊 MWS ListMatchingProducts 一无所知。
  • 也考虑了脚本选项。什么会更快?下载还是流式传输?图片大小只有几kb...

标签: javascript php image ssl


【解决方案1】:

您必须在您的服务器上编写一个代理并通过它显示所有图像。基本上你的网址应该是这样的:

$url = 'http://ecx.images-amazon.com/images/I/51MU5VilKpL._SL75_.jpg';
$url = urlencode($url);

echo '<img src="/proxy.php?from=' . $url . '">';

和proxy.php:

$cache = '/path/to/cache';
$url = $_GET['from'];

$hash = md5($url);
$file = $cache . DIRECTORY_SEPARATOR . $hash;
if (!file_exists($file)) {
    $data = file_get_contents($url);
    file_put_contents($file, $data);
}

header('Content-Type: image/jpeg');

readfile($file);

【讨论】:

  • 以这种方式做事时要小心,因为它可能被用来进行脚本注入。图像的来源没有经过验证,因此它可能被用于代理互联网上的任何内容。
【解决方案2】:

好的,我为您准备了一个流式传输示例。当然,您需要根据自己的需要对其进行调整。

假设你在你的服务器上创建了一个名为mws.php的php文件,内容如下:

if (isset($_GET['image']))
{
   header('Content-type: image/jpeg');
   header('Content-transfer-encoding: binary');
   echo file_get_contents($_GET['image']);
}

在网络上查找任何图片,例如:

http://freebigpictures.com/wp-content/uploads/2009/09/mountain-stream.jpg

现在您可以显示该图像,就好像它位于您自己的安全服务器上一样,带有以下网址:

https://<your server>/mws.php?image=http://freebigpictures.com/wp-content/uploads/2009/09/mountain-stream.jpg

如果您不止一次需要图像,当然最好将图像存储在本地,并且您必须包含正确的代码才能从亚马逊 MWS ListMatchingProducts 获取它,但这是基本思想。

请不要忘记保护您的脚本免受滥用。

【讨论】:

    猜你喜欢
    • 2017-12-14
    • 2017-11-06
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 2015-11-19
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多