web-dev-qa-db-fra.com

Ajax en utilisant https sur une page http

Mon site utilise les protocoles http et https; cela n'affecte pas le contenu. Mon site utilise les appels jQuery ajax, qui remplissent également certaines zones de la page.

Maintenant, je voudrais faire tous les appels ajax sur https. (s'il vous plaît ne me demandez pas pourquoi :)) Lorsque je suis sur une page avec le protocole https, les requêtes ajax fonctionnent. Lorsque je suis sur une page avec le protocole http, j'obtiens une erreur javascript: Accès à l'URI restreint refusé

Je sais qu'il s'agit d'un problème inter-domaines (en fait, il s'agit d'un problème inter-protocoles), et je sais que je devrais utiliser le même protocole pour les appels ajax que sur la page en cours.

Néanmoins, je souhaite que tous les appels ajax soient https et les appelle sur une page qui a été servie via http. Existe-t-il une solution de contournement pour y parvenir (une solution json/proxy?) Ou est-ce tout simplement impossible?

98
user135863

Ajouter l'en-tête Access-Control-Allow-Origin à partir du serveur

Access-Control-Allow-Origin: https://www.mysite.com

http://en.wikipedia.org/wiki/Cross-Origin_Resource_Sharing

57
DalSoft

Essayez JSONP.

la plupart des bibliothèques JS le rendent aussi simple que les autres appels AJAX, mais utilisent en interne un iframe pour effectuer la requête.

si vous n'utilisez pas JSON pour votre charge utile, vous devrez alors faire tourner votre propre mécanisme autour de l'iframe.

personnellement, je voudrais simplement rediriger la page http: // vers la page https: //

11
Javier

http://example.com/ peut résoudre un autre VirtualHost que https://example.com/ (qui, étant donné que l'en-tête de l'hôte n'est pas envoyé, répond à par défaut pour cette adresse IP), les deux sont traités comme des domaines distincts et sont donc soumis aux restrictions JS entre domaines.

callbacks JSON peut vous permettre d'éviter cela.

8
ceejayoz

Découvrez le projet opensource Forge. Il fournit une implémentation JavaScript TLS, ainsi que du Flash pour gérer les requêtes inter-domaines réelles:

http://github.com/digitalbazaar/forge/blob/master/README

En bref, Forge vous permettra de transformer XmlHttpRequests à partir d’une page Web chargée via http sur un site https. Vous devrez fournir un fichier de stratégie multi-domaines Flash via votre serveur pour activer les requêtes inter-domaines. Consultez les articles de blog à la fin du README) pour obtenir une explication plus détaillée de son fonctionnement.

Cependant, je devrais mentionner que Forge convient mieux aux requêtes entre deux domaines https différents. La raison en est qu'il existe une attaque potentielle MiTM. Si vous chargez JavaScript et Flash à partir d'un site non sécurisé, cela pourrait être compromis. L'utilisation la plus sécurisée consiste à le charger à partir d'un site sécurisé, puis à l'utiliser pour accéder à d'autres sites (sécurisés ou non).

4
dlongley

Vous pouvez essayer de charger la page https dans une iframe et acheminer toutes les demandes ajax dans/hors du cadre via un pont. C'est un hackaround mais cela pourrait fonctionner (vous ne savez pas si cela imposera les mêmes restrictions d'accès compte tenu du contexte sécurisé) . Sinon, un proxy http local pour rediriger les demandes (comme tout appel entre domaines) constituerait la solution acceptée.

2
Quintin Robinson

Voici ce que je fais:

Générez un iFrame masqué avec les données que vous souhaitez publier. Puisque vous contrôlez toujours cette iFrame, la même origine ne s'applique pas. Ensuite, soumettez le formulaire dans cet iFrame à la page SSL. La page ssl redirige ensuite vers une page non ssl avec des messages d'état. Vous avez accès à l'iFrame.

2
kjv