La SCRO Access-Control-Allow-Origin en dépit de corriger les en-têtes
Je suis en train de mettre en place simple Cross-Origin Resource sharing à l'aide de jQuery (1.7.1) alimenté ajax sur le client et apache servi python (django) du serveur. Selon toutes les instructions que j'ai lu mon les en-têtes sont correctement réglés, mais je reçois l'erreur suivante:
XMLHttpRequest ne peut pas charger http://myexternaldomain.com/get_data.
Origine http://localhost:8080 n'est pas autorisé par
Access-Control-Allow-Origin.
L'en-tête, je suis en train de (je ne suis pas sûr que c'est de même d'avoir passé le navigateur) envoyer est:
Request URL:http://myexternaldomain.com/get_data
Accept:application/json, text/javascript, */*; q=0.01
Origin:http://localhost:8080
Referer:http://localhost:8080/static/js/test-zetta.html
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.66 Safari/535.11
Le code javascript est
var request = $.ajax({
url : "http://myexternaldomain.com/get_data",
type : "POST",
dataType : "json",
crossDomain : true
});
Noter que origin
est correctement définie. Le serveur ajoute l'en-tête Access-Control-Allow-Origin = *
en utilisant le code python suivant
def process_response(self, response):
if response.has_header('Access-Control-Allow-Origin'):
return response
response['Access-Control-Allow-Origin'] = '*'
return response
def get_orders(request):
""" Tell worker what to do """
response_data = {}
response_data['action'] = 'probe'
response = process_response(HttpResponse(json.dumps(response_data), mimetype="application/json"))
return response
Si je visite l'adresse directement, il apparaît pour confirmer que l'en-tête est réglé correctement
Access-Control-Allow-Origin:*
Content-Type:application/json
Date:Thu, 08 Mar 2012 05:06:25 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Cependant, dans la croix paramètre de domaine, il échoue toujours (essayé chrome et firefox). J'ai essayé de mettre en œuvre le code exactement comme pour la réponse sélectionnée à cette question, mais obtenir la même erreur
Mise à jour
Je suis tout à fait sûr que le problème est côté serveur, comme j'ai réussi à obtenir mes appels ajax de travail avec un public différent de la SCRO serveur activée. Quand je compare les en-têtes de retour à partir de ce serveur public, et ceux retournés de la mienne (quand je l'ai tester à partir d'un même domaine), je ne vois aucune différence majeure qui pourrait rendre compte de la différence (voir ci-dessous).
Une subtilité que j'ai exclus, ce qui peut ou peut être important, c'est que le domaine est une amazone domaine de plusieurs sous-domaines. Le adresse réelle est http://ec2-23-20-27-108.compute-1.amazonaws.com/get_orders , n'hésitez pas à le sonder pour voir ce que je fais de mal.
De serveur Public
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Encoding:gzip
Content-Length:622
Content-Type:text/html
Date:Thu, 08 Mar 2012 15:33:20 GMT
Keep-Alive:timeout=15, max=99
Server:Apache/2.2.14 (Ubuntu)
Vary:Accept-Encoding
X-Powered-By:Perl/5.8.7, PHP/4.4.0
De mon serveur (pas de travail de la croix-domaine)
Access-Control-Allow-Origin:*
Content-Encoding:gzip
Content-Type:text/plain
Date:Thu, 08 Mar 2012 15:32:24 GMT
Server:Apache/2.2.20 (Ubuntu)
Transfer-Encoding:chunked
Vary:Accept-Encoding
- J'ai essayé, dans le passé, l'activation de la SCRO pour les données Json et n'a jamais été couronnée de succès. La SCRO peut être feuilletée comme ça. Vous seriez beaucoup mieux juste retour JSON-P.
- Vous êtes seulement à l'affichage des en-têtes de l'échange final entre votre serveur et le client local. Si vous regardez l'échange complet, je suis sûr que vous verrez une des OPTIONS de demande avec une réponse qui contient Access-Control-Allow-Méthodes et Access-Control-Allow-en-Têtes de têtes de.
Vous devez vous connecter pour publier un commentaire.
Donc j'ai été induit en erreur par la réponse à l'URL, et en fait, le problème était que lorsque l'on fait la requête ajax, j'ai été faire un 403 (seulement révélé dans firefox, pas de chrome) erreur due à la protection csrf.
enable_cors
wrapper autour de moncsrf_exempt
wrapper, nécessaires pour renverser la vapeur. J'étais comme, WTF...Vous avez à mettre en œuvre un "pré-flighted" demande et de la réponse parce que votre situation de compte comme un "pas si simple" demande. De base de la SCRO, qui nécessite uniquement l'en-tête d'Origine, ne peut avoir les types de contenu "application/x-www-form-urlencoded", "multipart/form-data", et "text/plain". Depuis votre retour "application/json", vous n'avez pas de répondre à cette exigence.
Je ne sais rien à propos de Django, mais je l'ai trouvé plus facile à mettre en œuvre le soutien de la SCRO à l'extérieur de ma demande par le biais de l'utilisation d'un Tomcat filtre. On dirait que vous pouvez faire la même chose avec Django.
2013-08-11: Il ressemble le dépôt GitHub n'est plus avec nous. Mais le Django paquet semble toujours être disponible à https://pypi.python.org/pypi/django-cors/0.1
J'ai été en utilisant l'excellent django-scro-en-têtes de la bibliothèque et s'est heurtée à ce problème ainsi. Pour moi, la solution était d'ajouter "accept-encoding" à la valeur par défaut CORS_ALLOW_HEADERS tuple.