Ajax utilisant https sur une page http

101

Mon site utilise le protocole http et https; cela n'affecte pas le contenu. Mon site utilise des 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 :)) Quand 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 que c'est un problème de domaine croisé (en fait, c'est un problème de protocole croisé), et je sais que je devrais utiliser le même protocole dans les appels ajax que sur la page actuelle.

Néanmoins, je veux que tous les appels ajax soient https et les appeler 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 simplement impossible?

user135863
la source
4
Pourquoi ne pas faire correspondre l'ajax au protocole de la page de chargement?
scheibk le
45
Ils ont spécifiquement dit "S'il vous plaît ne me demandez pas pourquoi."
Chris Moschini
Pourquoi avez-vous besoin d'AJAX avec HTTPS cependant .....
Miles
4
Par exemple, pour un formulaire de paiement plus dynamique qui se connecte à une passerelle de paiement comme paypal en arrière-plan afin que les gens puissent voir ce qui se passe. Juste une ou plusieurs possibilités
kentor

Réponses:

58

Ajoutez 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

DalSoft
la source
7
Excellente réponse - mais pas pris en charge par certains navigateurs utilisés comme Opera (pas du tout) et Internet Explorer (pris en charge depuis la version 8) caniuse.com/#search=cors
SimonSimCity
1
On dirait qu'Opera le supporte maintenant: en.wikipedia.org/wiki/... Seulement pas Opera Mini cependant ...
gitaarik
11

Essayez JSONP.

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

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

personnellement, je redirigerais simplement la page http: // vers la page https: // one

Javier
la source
1
hmm j'ai essayé jquery .ajax avec jsonp: jeu d'options 'jsonp_callback', mais toujours la même erreur js.
user135863
peut-être que vous devez ajouter le paramètre de rappel dans l'URL
Javier
@ user135863 Le point de terminaison que vous envoyez la requête prend-il en charge JSONP en premier lieu?
Leigh Brenecki
1
Pour ma santé mentale, je vais choisir votre dernière option ... Redirection simple vershttps:
Dzeimsas Zvirblis
9

http://example.com/ peut être résolu en un VirtualHost différent de https://example.com/ (qui, comme l'en-tête Host n'est pas envoyé, répond à la valeur par défaut pour cette IP), les deux sont donc traités comme séparés domaines et donc soumis à des restrictions JS interdomaines.

Les rappels JSON peuvent vous permettre d'éviter cela.

ceejayoz
la source
lien mort sur les rappels JSON :(
Kubie
@Kubie Cette réponse a dix ans demain, et les liens rompus sont la raison pour laquelle nous demandons que les questions contiennent suffisamment d'informations pour survivre à une.
ceejayoz
juste remarqué les 10 ans ha ... et oui bon point. C'est bon, va chercher celui-ci sur Google et modifier la réponse si je trouve quelque chose
Kubie
4

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 faire des XmlHttpRequests à partir d'une page Web chargée via http vers un site https. Vous devrez fournir un fichier de stratégie interdomaine Flash via votre serveur pour activer les demandes interdomaines. Consultez les articles de blog à la fin du README pour obtenir une explication plus approfondie de son fonctionnement.

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

dlongley
la source
2

Vous pouvez essayer de charger la page https dans une iframe et acheminer toutes les requêtes ajax dans / hors du cadre via un pont, c'est un hackaround mais cela pourrait fonctionner (je ne sais 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 interdomaine) serait la solution acceptée.

Quintin Robinson
la source
2
Après avoir lu ce fil, je m'en tiendrai à JSONP dslreports.com/forum/r21425467-IFrame-With-HTTPS-on-HTTP-Page
JGFMK
Cela peut être fait, mais assurez-vous de définir les en-têtes P3P si vous avez besoin de cookies de session de l'iFrame ... sinon MSE dira "nu uh euh"
srquinn
2

Voici ce que je fais:

Générez un iFrame masqué avec les données que vous souhaitez publier. Puisque vous contrôlez toujours cet iFrame, la même origine ne s'applique pas. Envoyez ensuite 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.

kjv
la source
Cela peut être fait, mais assurez-vous de définir les en-têtes P3P si vous avez besoin de cookies de session de l'iFrame ... sinon MSE dira "nu uh uh"
srquinn