jQuery $.ajax(), $.post envoyer des “OPTIONS” comme REQUEST_METHOD dans Firefox
Avoir des ennuis avec ce que je pensais était relativement simple plugin jQuery...
Le plugin doit extraire des données à partir d'un script php via ajax pour ajouter des options à un <select>
. La requête ajax est assez générique:
$.ajax({
url: o.url,
type: 'post',
contentType: "application/x-www-form-urlencoded",
data: '{"method":"getStates", "program":"EXPLORE"}',
success: function (data, status) {
console.log("Success!!");
console.log(data);
console.log(status);
},
error: function (xhr, desc, err) {
console.log(xhr);
console.log("Desc: " + desc + "\nErr:" + err);
}
});
Cela semble bien fonctionner dans Safari. Dans Firefox 3.5, le REQUEST_TYPE
sur le serveur est toujours "OPTIONS", et le $_POST les données n'apparaissent pas. Logs Apache en tant que demande de type "OPTIONS":
::1 - - [08/Jul/2009:11:43:27 -0500] "OPTIONS sitecodes.php HTTP/1.1" 200 46
Pourquoi cet appel ajax travail dans Safari, mais pas Firefox, et comment dois-je faire pour Firefox?
En-Têtes De Réponse Date: Wed, 08 Jul 2009 21:22:17 GMT Serveur:Apache/2.0.59 (Unix) PHP/5.2.6 DAV/2 X-Powered-By: PHP/5.2.6 Contenu-Durée 46 Keep-Alive timeout=15, max=100 Connection Keep-Alive Content-Type text/html En-Têtes De Requête Accueil bon de commande à:8888 L'Agent utilisateur de Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv:1.9.1) Gecko/20090624 Firefox/3.5 Accepter text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language fr-us,en;q=0.5 Accept-Encoding gzip,deflate Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive 300 Connection keep-alive Origine http://ux.inetu.act.org Contrôle d'accès-Demande-Méthode POST Contrôle d'accès-Demande-en-Têtes x-requested-with
Voici une photo de l'Firebug de sortie:
- Pouvez-vous poster le firebug réponse et en-têtes de requête. Je n'obtiens pas d'erreur quand je lance un code similaire dans Firefox.
- Ajout de l'en-tête info, et une photo de Firebug.
- Juste eu ce même problème lors de la mise en œuvre d'un serveur web intégré. Merci de me le demander 🙂
- Si vous êtes à la recherche pour Java JAX-RS solutions, voir ici: Access-Control-Allow-Origin
- Le comportement de firefox semble avoir changé maintenant? Je n'ai aucune option de demandes.
- Lorsque l'en-tête de réponse contient "Access-Control-Allow-en-Têtes: content-type", j'ai eu une demande d'OPTIONS et ensuite une requête POST.
Vous devez vous connecter pour publier un commentaire.
La raison de l'erreur est la même origine. Il ne vous permet de faire XMLHTTPRequests de votre propre nom de domaine. Voir si vous pouvez utiliser un JSONP rappel de la place:
content-type: "application/json"
, et la réponse du serveur en-tête contient des "Access-Control-Allow-en-Têtes: content-type", j'ai eu une demande d'OPTIONS et une requête POST, toujours à la recherche d'pourquoiJ'ai utilisé le code suivant sur Django côté d'interpréter la demande d'OPTIONS et le Contrôle d'Accès des en-têtes. Après cela, ma croix de domaine de demandes de Firefox a commencé à travailler. Comme dit avant, le navigateur envoie d'abord la demande d'OPTIONS, puis immédiatement après que le POST/GET
Edit: il semble que, au moins dans certains cas, vous devez également ajouter le même Contrôle d'Accès des en-têtes de la réponse réelle. Cela peut être un peu de confusion, car la demande semble réussir, mais Firefox ne passe pas le contenu de la réponse à l'Javascript.
Access-Control-Allow-Headers
doit contenir la valeurx-csrf-token
, pasx-csrftoken
.Ce mozilla developer center article décrit les différentes croix-demande de domaine scénarios. L'article semble indiquer qu'une requête POST avec le type de contenu 'application/x-www-form-urlencoded' doit être envoyé comme simple demande (qui n'ont pas de contrôle en amont des OPTIONS de demande). J'ai trouvé , cependant, que Firefox a envoyé la demande d'OPTIONS, même si mon message a été envoyé avec ce type de contenu.
J'ai été capable de faire ce travail par la création d'un gestionnaire de requêtes sur le serveur, le jeu de la "Access-Control-Allow-Origin' en-tête de réponse à '*'. Vous pouvez être plus restrictive, en mettant quelque chose de spécifique, comme"http://someurl.com'. Aussi, j'ai lu que, soi-disant, vous pouvez spécifier une liste séparée par des virgules des origines multiples, mais je ne pouvais pas obtenir que cela fonctionne.
Une fois Firefox reçoit la réponse à la demande d'OPTIONS avec une acceptables "Access-Control-Allow-Origin' valeur, il envoie une requête POST.
J'ai résolu ce problème en utilisant un à être entièrement basé sur Apache solution. Dans mon vhost /htaccess j'ai mis le bloc suivant:
Vous ne pouvez pas besoin de la dernière partie, selon ce qui se passe quand Apache s'exécute cible de votre script. Le crédit va à la amicale ServerFault folk pour la dernière partie.
Ce PHP en haut de la réponse script semble fonctionner. (Avec Firefox 3.6.11. Je n'ai pas encore fait beaucoup de tests.)
GET
,POST
, ...) est un peu trop à mon goût. (Et, je me demande toujours si l'envoi de ces est conforme avec les spécifications?)J'ai eu le même problème avec l'envoi de requêtes à google maps, et la solution est assez simple avec jQuery 1.5 - pour le type de données à utiliser
dataType: "jsonp"
Coupable, c'est le contrôle en amont de la demande à l'aide des OPTIONS de la méthode
Pour la requête HTTP méthodes qui peuvent provoquer des effets secondaires sur les données de l'utilisateur (en particulier pour les méthodes HTTP autres que GET ou POST pour utilisation avec certains types MIME), le cahier des charges des mandats que les navigateurs "contrôle en amont" de la demande, de solliciter des méthodes prises en charge par le serveur avec un HTTP OPTIONS de demande de la méthode, puis, lors de "l'approbation" à partir du serveur, l'envoi de la demande réelle avec la méthode de requête HTTP.
Web spécification de référence: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
J'ai résolu le problème en ajoutant des lignes suivantes dans la conf Nginx.
J'étais à la recherche par le biais de source 1.3.2, lors de l'utilisation de JSONP, la demande est faite par la construction d'un élément de SCRIPT dynamique, qui obtient passé les navigateurs Même domaine politique. Naturellement, vous ne pouvez pas faire une requête POST à l'aide d'un élément de SCRIPT, le navigateur de récupérer le résultat de l'utilisation de l'OBTENIR.
Que vous demandez un JSONP appel, l'élément SCRIPT n'est pas généré, car il ne présente lorsque le Type de l'appel AJAX est réglé pour OBTENIR.
http://dev.jquery.com/ticket/4690
Nous avons eu un problème comme ça avec ASP.Net. Notre IIS retournait une Erreur Interne du Serveur lorsque vous tentez d'exécuter un jQuery
$.post
pour obtenir le code html contenu en raison de PageHandlerFactory a été limitée à répondre seulementGET,HEAD,POST,DEBUG
Verbes. Ainsi, vous pouvez modifier la restriction en ajoutant le verbe "OPTIONS" de la liste ou sélectionnez l'option "Tous les Verbes"Vous pouvez modifier dans votre Gestionnaire des services internet, en sélectionnant votre site web, puis en sélectionnant Mappages de gestionnaires, double-cliquez dans votre PageHandlerFactory pour *.apx fichiers que vous avez besoin (Nous utilisons une application Intégrée de la piscine avec le framework 4.0). Cliquez sur Demande de Restriction, puis aller pour les Verbes Tabn et appliquer vos modifications.
Maintenant notre
$.post
demande fonctionne comme prévu 🙂Vérifier si votre formulaire
action
URL contient lewww
partie du domaine, tandis que la page d'origine que vous avez ouvert est considéré sanswww
.Typiquement fait pour les Urls Canoniques..
J'ai lutté pendant des heures avant de tomber sur cet article et a trouvé l'astuce de la Croix de Domaine.
Je semble que si
o.url = 'index.php'
et ce fichier existe, c'est ok et retour d'un message de succès dans la console. Il renvoie une erreur si j'utilise l'url:http://www.google.com
Si faire une requête post, pourquoi ne pas utiliser directement le $.post méthode:
C'est tellement plus simple.
J'ai posté un exemple clair de la façon de résoudre ce cas de contrôle le code du serveur de domaine que vous postez. Cette réponse est abordé dans ce fil, mais plus clairement, il explique l'OMI.
Comment puis-je envoyer un cross-domain requête POST via JavaScript?
Solution c'est:
json
&callback=?
à votre urlcette travaillé sur l'appel de Facebook API et avec Firefox. Firebug est à l'aide de
GET
au lieu deOPTIONS
avec les conditions ci-dessus (les deux).Une autre possibilité de contourner le problème est d'utiliser un script de proxy. Cette méthode est décrite pour exemple ici
Pouvez-vous essayer ce sans
contentType:application/x-www-form-urlencoded
Essayez d'ajouter l'option:
dataType: "json"
J'ai eu un problème similaire avec le fait d'essayer d'utiliser le Facebook de l'API.
La seule contentType qui n'a pas envoyer le Contrôlé la demande semble être juste text/plain... pas le reste des paramètres mentionnés à mozilla ici
Pour info: celui-ci Moz doc suggère X-Lori-têtes doivent déclencher un Contrôlé demande ... il ne fait pas.
Vous avez besoin de faire un peu de travail sur le côté serveur. Je vois que vous êtes à l'aide de PHP côté serveur, mais la solution pour .NET application web est ici:
Impossible de définir le type de contenu pour "application/json" en jQuery.ajax
Faire la même chose en PHP script et il fonctionne. Tout simplement: À la première demande, navigateur demande de serveur s'est autorisé à envoyer ces données avec ce type et la deuxième demande est la bonne/autorisés.
Essayez d'ajouter le suivant:
J'ai utilisé une url de proxy pour résoudre un problème similaire quand je veux publier des données sur mon apache solr hébergé dans un autre serveur. (Cela peut ne pas être la réponse parfaite, mais elle n'en résout mon problème.)
Suivre cette URL: En utilisant le Mode de Réécriture pour proxy, j'ajoute cette ligne à mon httpd.conf:
Par conséquent, je peux juste poster des données vers /solr au lieu de publier des données à http://ip:8983/solr/*. Puis, ce sera la publication des données de la même origine.
J'ai déjà ce code de manutention eh bien, mon cors situation en php:
Et ça marchait très bien en local et à distance, mais pas pour les téléchargements à distance.
Que quelque chose se produise avec apache/php OU mon code, je n'ai pas pris la peine de le chercher, lorsque vous demandez des OPTIONS, il retourne ma tête avec de la scro règles, mais avec 302 résultat. Par conséquent, mon navigateur ne reconnaît pas acceptable de la situation.
Ce que j'ai fait, basé sur @Mark McDonald réponse, c'est de mettre ce code après mon en-tête:
Maintenant, lors de la demande de
OPTIONS
il suffit d'envoyer l'en-tête et 202 résultat.S'il vous plaît noter:
JSONP prend uniquement en charge la demande de la méthode.
*Envoyer la demande par firefox:*
Au-dessus de demande d'envoyer par OPTIONS(tout ==>type: 'POST')!!!!
Mais au-dessus de demande d'envoyer par OBTENIR(tout ==>type: 'POST')!!!!
Lorsque vous êtes dans "la croix-domaine de la communication" , faites attention et soyez prudent.