2009-04-19 17 views
22

En mi sitio web https, ¿cómo puedo mostrar imágenes de un sitio web sin un certificado?¿Cómo mostrar imágenes no SSL en la conexión HTTPS?

I poseer el dominio de ejemplo:

  • http: // www .example.com
  • http: // estática .example.com (utilizado para mi CDN)

que poseen un certificado para www .example.com pero no para estática .example.com.

En mi www.example.com dominio, puede registrarse en el servicio a través de SSL usando http S: (www.) //www.example.com

En el formulario de inscripción, quiero mostrar imágenes de mi CDN que está en http: // static .example.com pero no posee un certificado para ese subdominio.

En el https: // www.example.com formulario de inscripción - estoy usando AJAX para tirar de forma dinámica sobre la imagen de http: // static.example.com. Parece que el navegador web no muestra imágenes que no sean SSL cuando se usa AJAX. Sin embargo, si esa imagen se encuentra en el dominio http S: //www.example.com (igual que el formulario de registro), la imagen se mostrará a través de AJAX.

Para la arquitectura & razones de diseño, me gustaría mantener esas imágenes en mi CDN (estático.ejemplo.com) sin tener que comprar un certificado.

¿Alguien sabe cómo puedo mostrar estas imágenes a través de AJAX desde mi subdominio no SSL en mi http S: //www.example de dominio?

Gracias de antemano.

Respuesta

3

igual que lo haría incluir una imagen https:

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

Algunos navegadores pueden quejarse al usuario, sin embargo, que va a cargar recursos inseguros para una página segura. Nada puedes hacer sobre eso.

+1

Cuando se utiliza AJAX, el navegador no reciben la oportunidad de quejarse ya que la imagen se carga dinámicamente ... en cambio, el navegador simplemente no se muestra la imagen. ¿Cuál es la pregunta completa, cualquier forma de evitar este comportamiento? –

+3

"Cuál es la pregunta completa", je ... No fue hasta que la cambiaste por completo. –

+0

Pero esto no es seguro. La razón por la cual las personas usan ssl es privacidad, ¿de qué sirve enviar imágenes http? – jiggunjer

3

No hay forma de hacerlo sin un certificado para static.example.com que no active una advertencia de seguridad o un aviso en algunos navegadores (particularmente Internet Explorer).

GoDaddy vende certificados SSL por $ 30ish. Diría que es primavera por un poquito de efectivo.

0

Para ampliar @Jaka Jančar's answer, ¿NECESITA descargar las imágenes a través de AJAX? Puede reemplazar la llamada AJAX con esto: agregar un elemento IMG dinámicamente.

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

De esta manera, su recurso de imagen se carga, con una devolución de llamada adecuada en caso de error/error.

Algunos navegadores pueden quejarse de que su página contiene contenido http y https, pero no es muy común (esto parece estar desactivado por defecto en la mayoría de los navegadores).

1

Sé que esta es una pregunta muy vieja, pero de todos modos pensé en arrojar mi $ .02.

Supongo que el subdominio de http://static.example.com es también un subdirectorio/carpeta de http://www.example.com (I.E. http://www.example.com/static) como es el caso con más hosting en estos días.

Puede varify esto, pero la navegación a http://www.example.com/static y https://www.example.com/static ... ¿ves la misma página como lo haría si navega a http://static.example.com

Si eso es cierto se puede alimentar a la imagen como esta ...

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

Otra posibilidad para aquellos en el típico shred hosting es utilizar el certificado compartido que muchos proveedores de hosting proporcionan. Consulte con el soporte de las empresas de alojamiento. Por lo general son algo como esto ...

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

Espero que todos lo encuentre útil!

+3

Hubiera sido mejor publicar la respuesta aquí, en lugar de dirigir a los visitantes a una publicación de blog, especialmente para una pregunta muy antigua. –

+2

Edité la pregunta para usar la respuesta dada por el usuario en la publicación del blog y eliminé el enlace externo. – joshuahedlund

2

Debe publicar todo el contenido que vincula o incrusta (directamente o mediante AJAX) en una página servida a través de HTTPS utilizando las referencias https://.

Una forma de evitar el problema de contenido HTTP plano de terceros es publicar ese contenido a través de un proxy inverso que usa HTTPS, posiblemente en su sitio o un servicio para esto. Puede haber implicaciones legales al hacerlo, dependiendo de si se considera como un mero proxy o duplicación de contenido (tal vez de manera similar a lo que hace la memoria caché de Google). Además, al hacerlo, está respondiendo efectivamente por el contenido que incrusta de esta manera.

16

puede hacer su propio proxy ssl.

Ejecuta todas las imágenes a través de este script. Simplemente haga un archivo y coloque este código PHP dentro. Use curl o file_get_contents para repetir el contenido.

Así que si usted desea llamar la imagen segura, lo llaman así:

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

gran solución. – neokio

+1

Una cosa para agregar ... Mi configuración de servidor bloquea las solicitudes que contienen '==' (ya que a menudo se usan en la actividad de análisis malicioso). Las cadenas 'base64_encode' a menudo terminan con '=='. Esto se puede corregir usando 'urlencode (base64_encode ($ url))' en la creación, y luego 'base64_decode (urldecode (@ $ _ GET ['url']))' en el código anterior. – neokio

+3

Esto es bueno, pero tenga cuidado con los problemas de seguridad aquí. asegúrese de SOLAMENTE permitir que se obtengan ciertas URL de dominios ... alias whitelisted domain. – fedmich

Cuestiones relacionadas