Comment contourner Access-Control-Allow-Origin?

Je fais un appel ajax à mon propre serveur sur une plate-forme qu'ils ont configurée pour empêcher ces appels ajax (mais j'ai besoin d'aller chercher les données de mon serveur pour afficher les données récupérées dans la base de données de mon serveur). Mon script ajax fonctionne, il peut envoyer les données sur le script php de mon serveur pour lui permettre de traiter. Cependant, il ne peut pas récupérer les données traitées car il est bloqué par "Access-Control-Allow-Origin"

Je n'ai pas accès à la source / noyau de cette plate-forme. Donc je ne peux pas supprimer le script qu'il ne me permet pas de le faire. (P / SI a utilisé Google Chrome's Console et a découvert cette erreur)

Le code Ajax comme indiqué ci-dessous:

  $.ajax({ type: "GET", url: "http://example.com/retrieve.php", data: "id=" + id + "&url=" + url, dataType: 'json', cache: false, success: function(data) { var friend = data[1]; var blog = data[2]; $('#user').html("<b>Friends: </b>"+friend+"<b><br> Blogs: </b>"+blog); } }); 

Ou existe-t-il un code équivalent JSON au script ajax ci-dessus? Je pense que JSON est autorisé.

J'espère que quelqu'un pourrait m'aider.

Placez-le en haut de retrieve.php

  header('Access-Control-Allow-Origin: *'); 

Il est important de noter que l'en- header() doit être appelé avant qu'une sortie réelle ne soit envoyée.

Faux

 <html> <?php header('Access-Control-Allow-Origin: *'); ?> 

Correct

 <?php header('Access-Control-Allow-Origin: *'); ?> <html> 

D'accord, mais vous savez que le * est un caractère générique et permet de créer des scripts entre sites de tous les domaines?

Pourquoi ne pas mettre une liste avec vos propres domaines, et domaines approuvés (et protocoles);

  header('Access-Control-Allow-Origin: http://mysite1.com', false); header('Access-Control-Allow-Origin: http://example.com', false); header('Access-Control-Allow-Origin: https://www.mysite2.com', false); header('Access-Control-Allow-Origin: http://www.mysite2.com', false); 

C'est beaucoup plus sûr. (Le 2ème paramètre "faux" indique à la fonction header() ne pas écraser l'ancien)

Pourquoi est-il plus sécurisé?

En autorisant l'accès à partir d'autres sites, votre propre site approuvé permet le lancement de session. Je vais faire un petit exemple – l'image Facebook permet une origine générique – cela signifie que vous pouvez créer votre propre site Web quelque part, et faire disparaître les appels AJAX (ou ouvrir des iframes) sur facebook. Cela signifie que vous pouvez saisir les informations enregistrées sur le Facebook d'un visiteur de votre site. Encore pire: vous pouvez POST requêtes de script POST et publier des données sur le facebook de quelqu'un – tout en parcourant votre site Web.

Soyez très prudent lorsque vous utilisez les en-têtes ACAO !

Attention , Chrome (et d'autres navigateurs) se plaignent que plusieurs en-têtes ACAO sont définis si vous suivez certaines des autres réponses.

L'erreur sera quelque chose comme XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access. XMLHttpRequest cannot load ____. The 'Access-Control-Allow-Origin' header contains multiple values '____, ____, ____', but only one is allowed. Origin '____' is therefore not allowed access.

Essaye ça:

 $http_origin = $_SERVER['HTTP_ORIGIN']; $allowed_domains = array( 'http://domain1.com', 'http://domain2.com', ); if (in_array($http_origin, $allowed_domains)) { header("Access-Control-Allow-Origin: $http_origin"); } 

J'ai réglé ce problème en appelant un contrôleur MVC3. J'ai ajouté:

 Response.AddHeader("Access-Control-Allow-Origin", "*"); 

Avant mon

 return Json(model, JsonRequestBehavior.AllowGet); 

Et aussi mon $.ajax se plaignait qu'il n'accepte pas l'en tête de type Content dans mon appel ajax, alors j'ai commenté que je sais que son JSON est passé à l'Action.

J'espère que cela pourra aider.

Mieux serait d'autoriser des domaines individuels, faites attention à http: //:

  header('Access-Control-Allow-Origin: http://www.foo.com', false); header('Access-Control-Allow-Origin: http://www.foo2.com', false)); 

Avez-vous réussi à ajouter l'en-tête Access-Control-Allow-Origin à la réponse envoyée par votre serveur? Like, Access-Control-Allow-Origin: * ?