2011-09-14 16 views
9

nie wydają się działać:Krzyż Domain AJAX preflightu sprawdzenie braku Pochodzenie

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

Kiedy uruchamiam go na jsfiddle, żądanie OPTIONS (zgodnie z narzędzi debugowania Chrome) odpala który wygląda tak:

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

A potem (zgodnie z narzędzi debugowania Chrome) mój lokalny serwer zwraca następujące nagłówki:

(ręcznie sformatowany reada ność)

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 

A potem w konsoli pojawia się komunikat o błędzie tak:

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

Ale nagłówek Access-Control-Allow-Origin pojawia identyczne kiedy mój serwer odpowiedział na prośbę prefligtu. Więc, czego mi tu brakuje tej układanki?

+0

Jak wyglądają nagłówki z wychodzącego żądania? Powinny zawierać nagłówek [Origin:] (https://developer.mozilla.org/en/HTTP_access_control). Uważam jednak, że przeglądarka [zawsze dołącza ją] (https://developer.mozilla.org/en/HTTP_access_control#Origin). – daxelrod

+0

Zaktualizowano pytanie do nagłówków z żądania opcji. –

Odpowiedz

4

Ohhhhh, OK I zdobione to wreszcie ...

Widocznie inspekcji wstępnych nagłówki odpowiedzi OPTIONS arent jedyne miejsce, które ich potrzebuje. Musisz również uwzględnić te nagłówki w odpowiedzi na rzeczywistą treść. Tylko te nagłówki spadły na preflight, myśląc, że to jedyny "bilet" potrzebny.

Dodałem te same nagłówki do żądania GET dla rzeczywistego zasobu i wszystko teraz działa świetnie. Chyba przegapiłem to w dokumentach.

+2

Czy mógłbyś wejść w szczegóły? Utknąłem w piekle CORS: http://stackoverflow.com/questions/13318436/https-access-control-allow-origin-not-working-no-matter-what-with-php-5-3-apac –

+0

Czy możesz mi pomóc w tym http://stackoverflow.com/questions/41952995/response-status-is-0-in-jquery-ajax?noredirect=1#comment71099392_41952995? – SSS

1

Musisz uwzględnić Origin w sekcji Access-Control-Allow-Headers, ponieważ Origin nie jest uważany za prosty nagłówek (IMO, specyfikacja powinna zawierać Origin na liście prostych nagłówków).

+0

Zmieniłem nagłówki odpowiedzi OPTIONS, aby uwzględnić nagłówki "Access-Control-Allow-Headers: HTTP_X_CUSTOMHEADER, Origin, Accept", ale nic to nie zmieniło. –