Как отобразить изображения не-SSL по HTTPS-соединению? - PullRequest
22 голосов
/ 19 апреля 2009

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

Мне принадлежит пример домена:

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

У меня есть сертификат для www .example.com, но не для static .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?

Заранее спасибо.

Ответы [ 7 ]

16 голосов
/ 05 октября 2012

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

Запустите все изображения через этот скрипт. Просто создайте файл и поместите этот код 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;
?>
3 голосов
/ 19 апреля 2009

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

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

3 голосов
/ 19 апреля 2009

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

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

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

2 голосов
/ 06 апреля 2012

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

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

1 голос
/ 30 сентября 2011

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

Я предполагаю, что поддомен http://static.example.com также является подкаталогом / папкой http://www.example.com (т. Е. 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

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

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

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

0 голосов
/ 20 января 2017

Я столкнулся с этой проблемой для локального агрегатора новостей, который я запускаю, и в итоге я использовал копию PHP для передачи изображений на свой сервер и затем подал их по SSL.

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

0 голосов
/ 19 апреля 2009

Чтобы продлить @ ответ Яки Янчара , НУЖНО ли вам загружать изображения через 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, но это не очень распространено (в большинстве браузеров по умолчанию это отключено).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...