web-dev-qa-db-fra.com

Cross-Domain AJAX n'envoie pas l'en-tête X-Requested-With

Créez un service Web sur http://www.a.com/service.asmx et envoyez-lui une demande ajax interdomaine à partir de http://www.b.com. Vérifiez les en-têtes dans Firebug, ou dans Live HTTP Headers, ou tout autre plugin que vous souhaitez.

Il n'y a aucune trace du champ X-Requested-With HTTP Header parmi les en-têtes de demande.

Cependant, si vous envoyez une demande ajax au même service à partir du même domaine (disons par exemple http://www.a.com/about), vous verrez ce champ d'en-tête.

Pourquoi le champ d'en-tête X-Requested-With est-il omis pour les demandes ajax interdomaines?

Mise à jour: Je sais que les appels JSONP ne sont pas AJAX appels dans la nature. Ainsi, vous ne verrez aucun X-Requested-With header dans les appels JSONP.

47
Saeed Neamati

Si vous utilisez jQuery pour effectuer votre demande ajax, il n'enverra pas l'en-tête X-Requested-With (HTTP_X_REQUESTED_WITH) = XMLHttpRequest, car il s'agit d'un domaine croisé. Mais il y a 2 façons de résoudre ce problème et d'envoyer l'en-tête:

Option 1) Définissez manuellement l'en-tête dans l'appel ajax:

$.ajax({
     url: "http://your-url...",
 headers: {'X-Requested-With': 'XMLHttpRequest'}
});  

Option 2) Dites à jQuery de ne pas utiliser les valeurs par défaut interdomaines, afin qu'il conserve l'en-tête X-Requested-With dans la demande ajax:

$.ajax({
  url: "http://your-url...",
 crossDomain: false
});

Mais avec cela, le serveur doit autoriser ces en-têtes, puis le serveur doit imprimer ces en-têtes:

print "Access-Control-Allow-Origin: *\n";
print "Access-Control-Allow-Headers: X-Requested-With, Content-Type\n";

La première ligne ci-dessus évitera l'erreur "L'origine n'est pas autorisée par Access-Control-Allow-Origin."
La deuxième ligne évitera l'erreur "Le champ d'en-tête de demande X-Requested-With n'est pas autorisé par Access-Control-Allow-Headers."