Voici deux pages, test.php et testserver.php.
test.php
<script src="scripts/jq.js" type="text/javascript"></script>
<script>
$(function() {
$.ajax({url:"testserver.php",
success:function() {
alert("Success");
},
error:function() {
alert("Error");
},
dataType:"json",
type:"get"
}
)})
</script>
testserver.php
<?php
$arr = array("element1",
"element2",
array("element31","element32"));
$arr['name'] = "response";
echo json_encode($arr);
?>
Maintenant mon problème: lorsque ces deux fichiers sont sur le même serveur (localhost ou web server), cela fonctionne et alert("Success")
est appelé; S'il se trouve sur des serveurs différents, ce qui signifie testserver.php sur le serveur Web et test.php sur localhost, cela ne fonctionne pas et alert("Error")
est en cours d'exécution. Même si l'URL dans ajax est remplacée par http://domain.com/path/to/file/testserver.php
javascript
jquery
ajax
json
cross-domain
Firose Hussain
la source
la source
Réponses:
Utilisez JSONP .
jQuery:
PHP:
L'écho peut être faux, cela fait un moment que je n'ai pas utilisé php. Dans tous les cas, vous devez afficher
callbackName('jsonString')
les guillemets. jQuery transmettra son propre nom de rappel, vous devez donc l'obtenir à partir des paramètres GET.Et comme Stefan Kendall l'a signalé, $ .getJSON () est une méthode abrégée, mais vous devez ensuite ajouter
'callback=?'
à l'URL en tant que paramètre GET (oui, la valeur est?, JQuery le remplace par sa propre méthode de rappel générée).la source
callbackName('/* json */')
au lieu decallbackName(/* json */)
?JSONP est une bonne option, mais il existe un moyen plus simple. Vous pouvez simplement définir l'en-
Access-Control-Allow-Origin
tête sur votre serveur. Le paramétrer sur*
acceptera les requêtes AJAX interdomaines de n'importe quel domaine. ( https://developer.mozilla.org/en/http_access_control )La méthode pour ce faire variera d'une langue à l'autre, bien sûr. Le voici dans Rails:
Dans cet exemple, l'
say_hello
action acceptera les demandes AJAX de n'importe quel domaine et retournera une réponse "bonjour!".Voici un exemple des en-têtes qu'il pourrait renvoyer:
Aussi simple soit-il, il a quelques limitations de navigateur. Voir http://caniuse.com/#feat=cors .
la source
.post()
méthode de jQuery, vous devez activer la prise en charge inter-domaines dans jQuery. Il est fait avec ceci:$.support.cors = true
.Vous pouvez contrôler cela via l'en-tête HTTP en ajoutant Access-Control-Allow-Origin . Le paramétrer sur * acceptera les requêtes AJAX inter-domaines de n'importe quel domaine.
En utilisant PHP, c'est vraiment simple, il suffit d'ajouter la ligne suivante dans le script auquel vous souhaitez avoir accès en dehors de votre domaine:
N'oubliez pas d'activer le module mod_headers dans httpd.conf.
la source
Vous devez consulter la politique de la même origine :
Pour que vous puissiez obtenir des données, il faut:
Même protocole et hôte
Vous devez implémenter JSONP pour le contourner.
la source
J'ai dû charger la page Web à partir du disque local "file: /// C: /test/htmlpage.html", appeler l'URL "http: //localhost/getxml.php" et le faire dans les navigateurs IE8 + et Firefox12 +, utiliser jQuery v1 .7.2 lib pour minimiser le code passe-partout. Après avoir lu des dizaines d'articles, il a finalement compris. Voici mon résumé.
Voici un exemple d'appel ajQuery jQuery avec quelques sysouts de débogage.
la source
header("Access-Control-Allow-Origin: *");
Il est vrai que la politique de même origine empêche JavaScript de faire des demandes sur plusieurs domaines, mais la spécification CORS autorise uniquement le type d'accès API que vous recherchez et est prise en charge par le lot actuel des principaux navigateurs.
Découvrez comment activer le partage de ressources d'origine croisée pour le client et le serveur:
http://enable-cors.org/
"Le partage des ressources d'origine croisée (CORS) est une spécification qui permet un accès vraiment ouvert au-delà des limites du domaine. Si vous diffusez du contenu public, veuillez envisager d'utiliser CORS pour l'ouvrir pour un accès universel à JavaScript / navigateur."
la source
C'est possible, mais vous devez utiliser JSONP, pas JSON. Le lien de Stefan vous a orienté dans la bonne direction. La page jQuery AJAX contient plus d'informations sur JSONP.
Remy Sharp a un exemple détaillé utilisant PHP .
la source
J'utilise le serveur Apache, j'ai donc utilisé le module mod_proxy. Activer les modules:
Puis ajouter:
Enfin, passez proxy-url à votre script.
la source
La sécurité du navigateur empêche de passer un appel ajax depuis une page hébergée sur un domaine vers une page hébergée sur un domaine différent; c'est ce qu'on appelle la " politique de même origine ".
la source
Il existe quelques exemples d'utilisation de JSONP qui incluent la gestion des erreurs.
Cependant, veuillez noter que l'événement d'erreur n'est pas déclenché lors de l'utilisation de JSONP! Voir: http://api.jquery.com/jQuery.ajax/ ou demande jQuery ajax utilisant une erreur jsonp
la source
Depuis les documents Jquery ( lien ):
En raison des restrictions de sécurité du navigateur, la plupart des demandes "Ajax" sont soumises à la même politique d'origine; la demande ne peut pas récupérer avec succès les données d'un domaine, sous-domaine ou protocole différent.
Les requêtes de script et JSONP ne sont pas soumises aux mêmes restrictions de politique d'origine.
Je suppose donc que vous devez utiliser jsonp pour la demande. Mais je n'ai pas essayé ça moi-même.
la source
Je connais 3 façons de résoudre votre problème:
Tout d'abord, si vous avez accès aux deux domaines, vous pouvez autoriser l'accès à tous les autres domaines en utilisant:
header("Access-Control-Allow-Origin: *");
ou juste un domaine en ajoutant du code ci-dessous au fichier .htaccess:
<FilesMatch "\.(ttf|otf|eot|woff)$"> <IfModule mod_headers.c> SetEnvIf Origin "http(s)?://(www\.)?(google.com|staging.google.com|development.google.com|otherdomain.net|dev02.otherdomain.net)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin </IfModule> </FilesMatch>
vous pouvez avoir une demande ajax vers un fichier php sur votre serveur et gérer la demande vers un autre domaine en utilisant ce fichier php.
la source
Pour Microsoft Azure, c'est légèrement différent.
Azure a un paramètre CORS spécial qui doit être défini. C'est essentiellement la même chose dans les coulisses, mais simplement définir l'en-tête que mentionne joshuarh ne fonctionnera pas. La documentation Azure pour l'activation de plusieurs domaines peut être trouvée ici:
https://docs.microsoft.com/en-us/azure/app-service-api/app-service-api-cors-consume-javascript
J'ai bidouillé avec cela pendant quelques heures avant de réaliser que ma plate-forme d'hébergement avait ce paramètre spécial.
la source
ça marche, tout ce dont vous avez besoin:
PHP:
JS (jQuery ajax):
la source