Votre pire scénario n'est pas aussi mauvais que vous le pensez.
Vous analysez déjà le flux RSS, vous disposez donc déjà des URL des images. Supposons que vous ayez une URL d'image comme http://otherdomain.com/someimage.jpg
. Vous réécrivez cette URL sous la forme https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad
. De cette façon, le navigateur fait toujours la demande via https, vous évitant ainsi les problèmes.
La partie suivante - créez une page proxy ou un servlet qui effectue les opérations suivantes -
- Lisez le paramètre url de la chaîne de requête et vérifiez le hachage
- Téléchargez l'image depuis le serveur et renvoyez-la au navigateur par proxy
- Si vous le souhaitez, mettez en cache l'image sur le disque
Cette solution présente certains avantages. Vous n'êtes pas obligé de télécharger l'image au moment de la création du html. Vous n'êtes pas obligé de stocker les images localement. De plus, vous êtes apatride; l'url contient toutes les informations nécessaires pour servir l'image.
Enfin, le paramètre de hachage est pour la sécurité; vous voulez que votre servlet ne serve des images que pour les URL que vous avez construites. Ainsi, lorsque vous créez l'url, calculez-la md5(image_url + secret_key)
et ajoutez-la en tant que paramètre de hachage. Avant de servir la requête, recalculez le hachage et comparez-le à ce qui vous a été transmis. Puisque la clé secret_key n'est connue que de vous, personne d'autre ne peut construire d'URL valides.
Si vous développez en java, le servlet n'est que quelques lignes de code. Vous devriez pouvoir porter le code ci-dessous sur toute autre technologie 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 vous recherchez une solution rapide pour charger des images via HTTPS, le service de proxy inverse gratuit à l' adresse https://images.weserv.nl/ peut vous intéresser. C'était exactement ce que je cherchais.
Si vous recherchez une solution payante, j'ai déjà utilisé Cloudinary.com qui fonctionne également bien mais qui est trop cher uniquement pour cette tâche, à mon avis.
la source
Je ne sais pas si cela conviendrait à ce que vous faites, mais comme solution rapide, je "envelopperais" le contenu http dans un script https. Par exemple, sur votre page qui est servie via https, j'introduirais un iframe qui remplacerait votre flux rss et dans le src attr de l'iframe, mettriez une URL d'un script sur votre serveur qui capture le flux et génère le html. le script lit le flux via http et le sort via https (donc "wrapping")
Juste une pensée
la source
En ce qui concerne votre deuxième exigence, vous pourrez peut-être utiliser l'événement onerror, c'est-à-dire.
<img onerror="some javascript;"...
Mettre à jour:
Vous pouvez également essayer d'itérer
document.images
dans le dom. Il existe unecomplete
propriété booléenne que vous pourrez peut-être utiliser. Je ne sais pas avec certitude si cela conviendra, mais cela vaut peut-être la peine d'être étudié.la source
Il serait préférable d'avoir simplement le contenu http sur https
la source
Parfois, comme dans les applications Facebook, nous ne pouvons pas avoir de contenu non sécurisé dans une page sécurisée. nous ne pouvons pas non plus rendre ces contenus locaux. par exemple une application qui se chargera dans iFrame n'est pas un simple contenu et on ne peut pas la rendre locale.
Je pense que nous ne devrions jamais charger le contenu http en https, nous ne devrions pas non plus replier la page https vers la version http pour éviter les dialogues d'erreur.
le seul moyen d'assurer la sécurité de l'utilisateur est d'utiliser la version https de tous les contenus, http://developers.facebook.com/blog/post/499/
la source
La réponse acceptée m'a aidé à mettre à jour cela à la fois vers PHP et CORS, j'ai donc pensé inclure la solution pour les autres:
PHP / HTML pur:
javascript / jQuery:
imageserve.php voir http://stackoverflow.com/questions/8719276/cors-with-php-headers?noredirect=1&lq=1 pour plus d'informations sur CORS
la source
Simplement: NE PAS LE FAIRE. Le contenu HTTP dans une page HTTPS est intrinsèquement non sécurisé. Point. C'est pourquoi IE affiche un avertissement. Se débarrasser de l'avertissement est une approche stupide.
Au lieu de cela, une page HTTPS ne doit avoir contenu HTTPS. Assurez-vous que le contenu peut également être chargé via HTTPS et référencez-le via https si la page est chargée via https. Pour le contenu externe, cela impliquera de charger et de mettre en cache les éléments localement afin qu'ils soient disponibles via https - bien sûr. Pas moyen de contourner cela, malheureusement.
L'avertissement est là pour une bonne raison. Sérieusement. Passez 5 minutes à réfléchir à la façon dont vous pourriez prendre en charge une page affichée en https avec un contenu personnalisé - vous serez surpris.
la source
Je me rends compte qu'il s'agit d'un ancien fil, mais une option consiste simplement à supprimer la partie http: de l'URL de l'image afin que ' http: //some/image.jpg » devienne «//some/image.jpg». Cela fonctionnera également avec les CDN
la source
La meilleure façon de travailler pour moi
la source