2009-04-19 3 views
22

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

Владею пример домен:

  • HTTP: // WWW .example.com
  • HTTP: // статический .example.com (используется для моей CDN)

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

На моем www.example.com домена, вы можете оформить подписку на услугу через SSL с использованием HTTP S: (. WWW) //www.example.com

В регистрационной форме, я хочу отображать изображения с моего 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 domain?

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

ответ

3

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

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

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

+1

При использовании AJAX, браузер не получите возможность пожаловаться, так как в настоящее время динамически загружается изображение ... вместо этого, браузер просто не отображается изображение. Каков весь вопрос, каким-либо образом это поведение? – 2009-04-19 18:16:18

+3

«В чем весь вопрос», хе-хе ... Это было только после того, как вы полностью изменили его. –

+0

Но это небезопасно. Вся причина, по которой люди используют ssl, - это конфиденциальность, в чем смысл отправки http-изображений? – jiggunjer

3

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

GoDaddy продает сертификаты SSL за 30 долларов США. Я бы сказал, весной, за небольшую наличность.

0

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

1

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

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

Вы можете varify это, но просмотр в 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

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

+3

Было бы лучше разместить здесь ответ, а не направлять посетителей на сообщение в блоге, особенно по очень старому вопросу. –

+2

Я отредактировал вопрос, чтобы использовать ответ, указанный пользователем в сообщении блога, и удалил внешнюю ссылку. – joshuahedlund

2

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

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

16

вы можете создать свой собственный прокси-сервер 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; 
?> 
+1

отличное решение. – neokio

+1

Одна вещь для добавления ... Моя конфигурация сервера блокирует запросы, содержащие «==» (поскольку они часто используются для активности вредоносного сканирования). Строки 'base64_encode' часто заканчиваются на '=='. Это можно исправить, используя 'urlencode (base64_encode ($ url))' при создании, а затем 'base64_decode (urldecode (@ $ _ GET ['url']))' в коде выше. – neokio

+3

Это хорошо, но будьте осторожны с вопросами безопасности здесь. убедитесь, что ТОЛЬКО разрешают определенные URL-адреса доменов ... aka whitelisted domain. – fedmich

-1

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

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