2011-09-14 16 views
9

Questo non sembra funzionare:tra domini AJAX preflight di controllo in mancanza Origine

$.ajax({ 
    url:  "http://localhost:3000/foo.json", 
    data:  { foo: 'bar' }, 
    headers: { 'HTTP_X_CUSTOMHEADER': 'foobar' }, 
    xhrFields: { withCredentials: true } 
}); 

Quando eseguo su jsfiddle, una richiesta OPTIONS (secondo gli strumenti di debug Chrome) spara che assomiglia a questo:

Access-Control-Request-Headers: Origin, HTTP_X_CUSTOMHEADER, Accept 
Access-Control-Request-Method: GET 
Origin:       http://fiddle.jshell.net 

E poi (secondo gli strumenti di debug Chrome) il mio server locale restituisce i seguenti intestazioni:

(riformattato manualmente per reada bilità)

Access-Control-Allow-Credentials: true 
Access-Control-Allow-Headers:  HTTP_X_CUSTOMHEADER 
Access-Control-Allow-Methods:  GET, POST, PUT, DELETE, OPTIONS 
Access-Control-Allow-Origin:  http://fiddle.jshell.net 
Access-Control-Max-Age:   10 

Cache-Control:     no-cache 
Connection:      Keep-Alive 
Content-Length:     1 
Content-Type:      text/html; charset=utf-8 
Date:        Wed, 14 Sep 2011 22:42:28 GMT 
Server:       WEBrick/1.3.1 (Ruby/1.8.7/2010-01-10) 
X-Runtime:      2 

E poi nella console ottengo un messaggio di errore simile a questo:

XMLHttpRequest cannot load http://localhost:3000/foo.json?foo=bar. 
Origin http://fiddle.jshell.net is not allowed by Access-Control-Allow-Origin. 

di testa che però Access-Control-Allow-Origin appare identico a quando il mio server ha risposto con la richiesta di verifica preliminare. Quindi quale pezzo mi manca qui di questo puzzle?

+0

Che aspetto hanno le intestazioni della richiesta in uscita? Dovrebbero includere un'intestazione [Origine:] (https://developer.mozilla.org/en/HTTP_access_control). Tuttavia, credo che il browser [lo aggiunga sempre] (https://developer.mozilla.org/en/HTTP_access_control#Origin). – daxelrod

+0

Aggiornata la domanda con le intestazioni dalla richiesta di opzioni. –

risposta

4

Ohhhhh, ok ho capito questo, finalmente ...

A quanto pare i preflight OPTIONS intestazioni di risposta arent l'unico posto che ha bisogno di loro. È necessario includere anche quelle intestazioni sulla risposta per il contenuto effettivo. Ho avuto solo queste intestazioni che arrivavano al preflight, pensando che fosse l'unico "biglietto" necessario.

Quindi ho aggiunto le stesse intestazioni alla richiesta GET per l'asset effettivo e tutto funziona alla grande ora. Immagino di averlo perso nei documenti.

+2

Potresti entrare in maggiori dettagli? Sono bloccato nell'inferno CORS: http://stackoverflow.com/questions/13318436/https-access-control-allow-origin-not-working-no-matter-what-with-php-5-3-apac –

+0

Potete aiutarmi con questo http://stackoverflow.com/questions/41952995/response-status-is-0-in-jquery-ajax?noredirect=1#comment71099392_41952995 ?? – SSS

1

È necessario includere l'origine nella sezione Access-Control-Allow-Headers, poiché Origin non è considerato un'intestazione semplice (IMO, la specifica deve includere Origin nell'elenco di intestazioni semplici).

+0

Ho modificato le intestazioni di risposta OPTIONS per includere 'Access-Control-Allow-Headers: HTTP_X_CUSTOMHEADER, Origin, Accept' ma non ha modificato nulla. –

Problemi correlati