2009-04-19 12 views
22

Sul mio sito Web https, come posso visualizzare le immagini da un sito Web senza un certificato?Come visualizzare immagini non SSL sulla connessione HTTPS?

I proprietari del dominio esempio di:

  • http: // www .example.com
  • http: // statica .example.com (usato per il mio CDN)

Possiedo un certificato per www .example.com ma non per statica .example.com.

Sul mio www.example.com dominio, è possibile registrarsi al servizio su SSL utilizzando http S: (. Www) //www.example.com

nel modulo di registrazione, voglio visualizzare le immagini dal mio CDN su http: // statico .example.com ma non possedere un certificato per tale sottodominio.

Sulle https: // www.example.com modulo di registrazione - sto usando AJAX per tirare dinamicamente sull'immagine da http: // static.example.com. Sembra che il browser Web non visualizzi affatto immagini non SSL quando si utilizza AJAX. Tuttavia, se l'immagine si trovava sul dominio http S: //www.example.com (lo stesso del modulo di registrazione), l'immagine verrà visualizzata tramite AJAX.

Per motivi di progettazione dell'architettura &, vorrei conservare quelle immagini sul mio CDN (static.example.com) senza dover acquistare un certificato.

Qualcuno sa come posso visualizzare queste immagini tramite AJAX dal mio sottodominio non SSL sul mio http S: //www.esempio dominio?

Grazie in anticipo.

risposta

3

proprio come si farebbe includere un'immagine https:

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

Alcuni browser potrebbero lamentarsi per l'utente, però, che si sta caricando le risorse non sicure per una pagina protetta. Non puoi fare niente a riguardo.

+1

Quando si usa AJAX, il browser non si ottiene la possibilità di lamentarsi in quanto l'immagine viene caricata dinamicamente ... invece, il browser semplicemente non visualizza l'immagine. Qual è l'intera domanda, in qualche modo attorno a questo comportamento? –

+3

"Qual è l'intera domanda", heh ... Non è stato fino a quando non l'hai completamente cambiato. –

+0

Ma questo non è sicuro. L'intera ragione per cui le persone usano ssl è la privacy, che senso ha mandare le immagini http? – jiggunjer

3

Non esiste un modo per eseguire questa operazione senza un certificato per static.example.com che non attiverà un avviso di sicurezza o un prompt in alcuni browser (in particolare Internet Explorer).

GoDaddy vende certificati SSL per $ 30ish. Direi primavera per un po 'di soldi.

0

Per estendere @Jaka Jančar's answer, è necessario scaricare le immagini tramite AJAX? È possibile sostituire la chiamata AJAX con questo: aggiungere un elemento IMG dinamicamente.

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); 
} 

In questo modo, la risorsa immagine viene caricata, con un callback corretto in caso di esito positivo/errore.

Alcuni browser potrebbero lamentarsi del fatto che la pagina contenga sia il contenuto http che https, ma non è molto comune (questa impostazione sembra essere disattivata per impostazione predefinita nella maggior parte dei browser).

1

So che questa è una domanda molto vecchia, ma ho pensato di inserire comunque i miei $ 0,02.

Suppongo che il sottodominio di http://static.example.com sia anche una sottodirectory/cartella di http://www.example.com (I.E. http://www.example.com/static), come nel caso della maggior parte degli hosting in questi giorni.

È possibile varify questo, ma la navigazione a http://www.example.com/static e https://www.example.com/static ... vedete la stessa pagina come si farebbe se si passa a http://static.example.com

Se questo è vero è possibile alimentare l'immagine come questo ...

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

Un'altra possibilità per chi è in hosting shred tipico è utilizzare il cert condiviso che molti provider di hosting forniscono. Verificare con il supporto delle società di hosting. Essi sono di solito qualcosa di simile ...

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

Spero che tutti trovare questo utile!

+3

Sarebbe stato meglio pubblicare la risposta qui, piuttosto che indirizzare i visitatori a un post sul blog, soprattutto per una domanda molto vecchia. –

+2

Ho modificato la domanda per utilizzare la risposta fornita dall'utente sul post del blog e rimosso il collegamento esterno. – joshuahedlund

2

È necessario pubblicare tutto il contenuto che si collega o si incorpora (direttamente o tramite AJAX) su una pagina pubblicata su HTTPS utilizzando i riferimenti https://.

Un modo per aggirare il problema dei contenuti HTML di terze parti è quello di offrire tale contenuto tramite un proxy inverso che utilizza HTTPS, probabilmente sul tuo sito o un servizio per questo. Potrebbero esserci implicazioni legali nel farlo, a seconda che sia considerato come semplice proxy o duplicazione del contenuto (forse in modo simile a ciò che fa la cache di Google). Inoltre, così facendo, garantisci in modo efficace il contenuto che incorpori in questo modo.

16

è possibile creare il proprio proxy ssl.

Eseguire tutte le immagini tramite questo script. Basta creare un file e inserire questo codice PHP. Utilizzare curl o file_get_contents per echeggiare il contenuto.

Quindi, se si desidera chiamare l'immagine sicura, si chiamano in questo modo:

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

ottima soluzione. – neokio

+1

Una cosa da aggiungere ... La mia configurazione server blocca le richieste che contengono '==' (poiché sono spesso utilizzate in attività di scansione maligne). Le stringhe 'base64_encode' terminano spesso con '=='. Questo può essere corretto usando 'urlencode (base64_encode ($ url))' alla creazione, e quindi 'base64_decode (urldecode (@ $ _ GET ['url']))' nel codice sopra. – neokio

+3

Questo è buono, ma attenzione ai problemi di sicurezza qui. assicurati di SOLO consentire il recupero di determinati URL di domini ... ovvero un dominio autorizzato. – fedmich

-1

mi ha colpito questo problema per un aggregatore di notizie locali che corro, ho finito per usare PHP di copia per trascinare le immagini sul mio server e servirle su SSL.

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