Подтвердить что ты не робот

Как отображать изображения без SSL в HTTPS-соединении?

На моем веб-сайте https, как я могу отображать изображения с веб-сайта без сертификата?

У меня есть пример домена:

  • Http:// WWW.example.com
  • http:// static.example.com(используется для моего CDN)

У меня есть сертификат для www.example.com, но не для статического.example.com.

В моем домене www.example.com вы можете зарегистрироваться для службы через SSL, используя http S://www.example.com

В регистрационной форме (www.) я хочу отображать изображения с моего CDN, который находится по адресу http:// static.example.com, но не имеет сертификата для этого поддомена.

В https:// www.example.com регистрационная форма - я использую AJAX для динамического перемещения изображения по адресу http:// static.example.com. Кажется, что веб-браузер вообще не отображает изображения без SSL при использовании AJAX. Однако если это изображение было расположено в домене http S://www.example.com(так же, как и в регистрационной форме), изображение будет отображаться через AJAX.

По соображениям архитектуры и дизайна я хотел бы сохранить эти изображения на моем CDN (static.example.com), не приобретая сертификат.

Кто-нибудь знает, как я могу отображать эти изображения через AJAX из моего поддомена без SSL в моем домене http S://www.example?

Спасибо заранее.

4b9b3361

Ответ 1

вы можете создать собственный прокси-сервер ssl.

Запустите все изображения с помощью этого script. Просто создайте файл и поместите этот PHP-код внутри. Используйте curl или file_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;
?>

Ответ 2

Так же, как вы бы включили https-образ:

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

Некоторые браузеры могут жаловаться на пользователя, однако, что вы загружаете небезопасные ресурсы для безопасной страницы. Вы ничего не можете с этим поделать.

Ответ 3

Нет никакого способа сделать это без сертификата для static.example.com, который не будет вызывать предупреждение о безопасности или приглашение в некоторых браузерах (в частности, Internet Explorer).

GoDaddy продает SSL-сертификаты за 30 долларов США. Я бы сказал spring за немного денег.

Ответ 4

Вы должны обслуживать весь контент, который вы связываете или вставляете (напрямую или через AJAX) на странице, обслуживаемой через HTTPS, с помощью https:// ссылок.

Один из способов обойти проблему стороннего, простого HTTP-контента - обслуживать этот контент через обратный прокси-сервер, который использует HTTPS, возможно, на вашем сайте или службу для этого. При этом могут быть юридические последствия, в зависимости от того, считается ли он простым проксированием или дублированием контента (возможно, аналогично тому, что делает кеш Google). Кроме того, делая это, вы эффективно ругаетесь за контент, который вы вставляете таким образом.

Ответ 5

Я знаю, что это действительно старый вопрос, но я думал, что в любом случае я бы выбросил $.02.

Я предполагаю, что субдомен http://static.example.com также является подкаталогом/папкой http://www.example.com (IE http://www.example.com/static), как в случае с большинством хостинга в эти дни.

Вы можете изменить это, но просматривая http://www.example.com/static и https://www.example.com/static... вы видите ту же страницу, что и в случае, если вы перейдете к http://static.example.com

Если это правда, вы можете подать изображение следующим образом:

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

Еще одна возможность для тех, кто находится на типичном хостинге shred, использует общий сертификат, предоставляемый многими провайдерами хостинга. Проконсультируйтесь с поддержкой хостинговых компаний. Они обычно что-то вроде этого...

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

Надеюсь, вы все найдете это полезным!

Ответ 6

Чтобы продлить @Jaka Jančar ответ, вам НЕОБХОДИМО загружать изображения через 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