Tu peor escenario no es tan malo como crees.
Ya está analizando la fuente RSS, por lo que ya tiene las URL de la imagen. Digamos que tiene una URL de imagen como http://otherdomain.com/someimage.jpg
. Vuelve a escribir esta URL como https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. De esta manera, el navegador siempre realiza una solicitud a través de https, por lo que se deshace de los problemas.
La siguiente parte: cree una página proxy o un servlet que haga lo siguiente:
- Lea el parámetro de URL de la cadena de consulta y verifique el hash
- Descargue la imagen del servidor y vuelva a enviarla por proxy al navegador
- Opcionalmente, caché la imagen en el disco
Esta solución tiene algunas ventajas. No es necesario descargar la imagen al momento de crear el html. No es necesario que almacene las imágenes localmente. Además, eres apátrida; la url contiene toda la información necesaria para servir la imagen.
Finalmente, el parámetro hash es por seguridad; solo desea que su servlet sirva imágenes para las URL que ha construido. Entonces, cuando crees la URL, calcúlala md5(image_url + secret_key)
y añádela como el parámetro hash. Antes de entregar la solicitud, vuelva a calcular el hash y compárelo con lo que se le pasó. Dado que solo usted conoce la clave_secreta, nadie más puede construir URL válidas.
Si está desarrollando en Java, el Servlet son solo unas pocas líneas de código. Debería poder transferir el siguiente código a cualquier otra tecnología de back-end.
/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/
protected void proxyResponse (String targetURL, HttpServletRequest request,
HttpServletResponse response) throws IOException {
GetMethod get = new GetMethod(targetURL);
get.setFollowRedirects(true);
/*
* Proxy the request headers from the browser to the target server
*/
Enumeration headers = request.getHeaderNames();
while(headers!=null && headers.hasMoreElements())
{
String headerName = (String)headers.nextElement();
String headerValue = request.getHeader(headerName);
if(headerValue != null)
{
get.addRequestHeader(headerName, headerValue);
}
}
/*Make a request to the target server*/
m_httpClient.executeMethod(get);
/*
* Set the status code
*/
response.setStatus(get.getStatusCode());
/*
* proxy the response headers to the browser
*/
Header responseHeaders[] = get.getResponseHeaders();
for(int i=0; i<responseHeaders.length; i++)
{
String headerName = responseHeaders[i].getName();
String headerValue = responseHeaders[i].getValue();
if(headerValue != null)
{
response.addHeader(headerName, headerValue);
}
}
/*
* Proxy the response body to the browser
*/
InputStream in = get.getResponseBodyAsStream();
OutputStream out = response.getOutputStream();
/*
* If the server sends a 204 not-modified response, the InputStream will be null.
*/
if (in !=null) {
IOUtils.copy(in, out);
}
}
Si está buscando una solución rápida para cargar imágenes a través de HTTPS, el servicio de proxy inverso gratuito en https://images.weserv.nl/ puede interesarle. Era exactamente lo que estaba buscando.
Si está buscando una solución paga, he usado anteriormente Cloudinary.com, que también funciona bien, pero en mi opinión, es demasiado costoso únicamente para esta tarea.
fuente
No sé si esto encajaría con lo que estás haciendo, pero como solución rápida "envolvería" el contenido http en un script https. Por ejemplo, en su página que se sirve a través de https, introduciría un iframe que reemplazaría su feed rss y en el atributo src del iframe pondría una URL de un script en su servidor que captura el feed y genera el html. el script lee el feed a través de http y lo envía a través de https (por lo tanto, "envuelve")
Solo un pensamiento
fuente
Con respecto a su segundo requisito, es posible que pueda utilizar el evento onerror, es decir.
<img onerror="some javascript;"...
Actualizar:
También puede intentar iterar
document.images
en el dom. Hay unacomplete
propiedad booleana que podría utilizar. No estoy seguro de si esto será adecuado, pero valdría la pena investigarlo.fuente
Sería mejor tener el contenido http en https
fuente
A veces, como en las aplicaciones de Facebook, no podemos tener contenidos no seguros en una página segura. tampoco podemos hacer local esos contenidos. por ejemplo, una aplicación que se cargará en iFrame no es un contenido simple y no podemos hacerlo local.
Creo que nunca deberíamos cargar contenido http en https, y tampoco deberíamos retroceder la página https a la versión http para evitar el diálogo de error.
la única forma de garantizar la seguridad del usuario es utilizar la versión https de todos los contenidos, http://developers.facebook.com/blog/post/499/
fuente
La respuesta aceptada me ayudó a actualizar esto tanto en PHP como en CORS, así que pensé en incluir la solución para otros:
PHP / HTML puro:
javascript / jQuery:
imageserve.php, consulte http://stackoverflow.com/questions/8719276/cors-with-php-headers?noredirect=1&lq=1 para obtener más información sobre CORS
fuente
Simplemente: NO LO HAGAS. El contenido HTTP dentro de una página HTTPS es intrínsecamente inseguro. Punto. Por eso IE muestra una advertencia. Deshacerse de la advertencia es un enfoque estúpido.
En cambio, una página HTTPS solo debe tener contenido HTTPS. Asegúrese de que el contenido también se pueda cargar a través de HTTPS y haga referencia a él a través de https si la página se carga a través de https. Para el contenido externo, esto significará cargar y almacenar en caché los elementos localmente para que estén disponibles a través de https, seguro. No hay forma de evitar eso, lamentablemente.
La advertencia está ahí por una buena razón. Seriamente. Dedique 5 minutos a pensar cómo podría hacerse cargo de una página que se muestra en https con contenido personalizado; se sorprenderá.
fuente
Me doy cuenta de que este es un hilo antiguo, pero una opción es simplemente eliminar la parte http: de la URL de la imagen para que ' http: //alguno/imagen.jpg ' se convierta en '//alguno/imagen.jpg'. Esto también funcionará con CDN
fuente
La mejor manera de trabajar para mi
fuente