2012-08-13 1 views
13

Ich versuche, eine Antwort auf die HTTP OPTIONS-Methode mit einem Access-Control-Allow-Origin-Header bereitzustellen, der den Inhalt des Origin-Headers in der Anforderung kopiert.Access-Control-Allow-Origin-Header funktioniert nicht - Was mache ich falsch?

Dies funktioniert anscheinend nicht, aus Gründen, die ich nicht herausfinden kann.

tl; dr: Antwort von OPTIONS sagt:

Access-Control-Allow-Origin: http://10.0.0.105:9294 

nachfolgende GET hat:

Origin:http://10.0.0.105:9294 

Chrome sagt:

Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin 

WTF nicht?

Weitere Einzelheiten ...

von in Chrome Developer Tools Fenster suchen, sind die Request-Header:

OPTIONS /user/kris HTTP/1.1 
Host: 10.0.0.104:8080 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://10.0.0.105:9294 
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.75 Safari/537.1 
Access-Control-Request-Headers: origin, x-requested-with, content-type, accept 
Accept: */* 
Referer: http://10.0.0.105:9294/ 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 

Die Response-Header sind:

HTTP/1.0 200 OK 
Date: Mon, 13 Aug 2012 11:23:45 GMT 
Server: WSGIServer/0.1 Python/2.7.3 
Content-Length: 0 
Access-Control-Allow-Methods: GET, PUT, POST, DELETE, HEAD, OPTIONS 
Access-Control-Max-Age: 10 
Access-Control-Allow-Origin: http://10.0.0.105:9294 
Access-Control-Allow-Headers: X-Requested-With, Authorization, X-Huzu-User, Content-Type, Accept 
Content-Type: text/html; charset=UTF-8 

Nach jQuery sendet seine OPTIONS Anfrage und bekommt die obige Antwort, 2 seltsame Dinge passieren. Die OPTIONS-Antwort (die ein 200) zeigt, in der Entwicklerkonsole als Fehler up:

OPTIONS http://10.0.0.104:8080/user/kris 200 (OK) 

Danach wird mit einer GET-Anforderung wird zurückgewiesen. Fehler in der Konsole:

XMLHttpRequest cannot load http://10.0.0.104:8080/user/kris. Origin http://10.0.0.105:9294 is not allowed by Access-Control-Allow-Origin. 

Ich kann nicht warum nicht sehen. Was mache ich falsch?

+0

Ich habe kein minimales fehlerhaftes Beispiel des jQuery-Codes, der hier verwendet werden könnte. Angenommen, es gibt nichts Seltsames an dem JavaScript-Code, d. H. Es handelt sich nur um einen einzelnen jQuery-Befehl get(), was zu der oben angegebenen OPTIONS-Anfrage führt. Meine Frage ist: Was stimmt nicht mit der Antwort? – scav

+0

Ist es nur ich oder besteht ein Unterschied zwischen der Host-URL (10.0.0.104:8080) und der Referer-URL (10.0.0.105:9294/)? – rene

+0

@rene ja. Mein Server ist eine Python-Wsgi-App, die auf meinem lokalen Rechner läuft (10.0.0.104:8080), und der Cross-Site-Test findet von einer Seite statt, die ich von 10.0.0.105:9294 geladen habe.Ich weiß nicht, welchen Effekt der Referer auf die Zugriffskontrolle hat. Denkst du, dass es relevant ist? Wenn ja, was mache ich damit? – scav

Antwort

20

OK, ich denke ich habe es. Es scheint, dass eine ordnungsgemäße Behandlung der OPTIONS-Anfrage vor dem Flug erforderlich ist, aber nicht ausreichend ist für Cross-Site-Ressourcenanforderungen zu arbeiten.

Nachdem die Anfrage OPTIONEN kommt zurück mit zufriedenstellenden Header, alle Antworten auf alle nachfolgenden Anforderungen auf den gleichen URL auch haben die notwendige „Access-Control-Allow-Origin“ Header haben, sonst wird der Browser schlucken sie, und sie werden nicht einmal im Debugger-Fenster angezeigt.

So wird aussehen wie der Browser abgebrochen die Anfrage wegen eines Problems in der OPTIONS-Antwort, aber tatsächlich, der Browser ist auf die Antwort-Header aus der realen Anfrage und dann ablehnen sie.

+0

Da Sie mit Ihrer Abfrage fertig sind, können Sie mir in dieser ähnlichen Frage helfen ? http://stackoverflow.com/questions/11953132/no-response-obtet-while-implementing-cors –

+3

@scav Wie hast du es gelöst – Hunt

+0

@scov +1 Kann dir nicht genug danken. Du hast mir Stunden des Debuggens gespart! – alf