2013-07-27 14 views
7

Próbuję utworzyć żądanie GET pochodzenia krzyżowego za pomocą jQuery.ajax(). Mój serwer jest skonfigurowany do akceptowania takich żądań. Chrome nie pozwoli mi wysłać nagłówki:Przeglądarki Webkit nie pozwalają mi ustawić nagłówków preflightów CORS

Access-Control-Request-Method

Access-Control-request-Główki

Odmówił ustawić niebezpieczny nagłówek „Access-Control-request- metoda”< - błąd wiadomość

Oto moja prośba ajax:

$.ajax({ 
    type:"GET", 
    headers: { 
     'Access-Control-Request-Method' : 'GET', 
     'Access-Control-Request-Headers': 'X-Custom' 
    },  
    url: "http://localhost:3000",  
    success: function(msg) { 
     console.log(msg); 
    } 
}); 

Oczekiwano, że te nagłówki spowodują, że przeglądarka utworzy żądanie przed lotem (OPCJE) w celu negocjacji z serwerem. Wiem, że już to osiągnąłem. Czy ktoś może mi powiedzieć, o czym zapominam?

Wielkie dzięki!

+1

zestaw 'Access-Control-Expose-Headers' na cokolwiek, np.' X-json' – Ohgodwhy

+0

Co? To nie jest nagłówek, który chcę wysłać. Czy możesz rozwinąć proszę? – Nick

+2

To obejście. Widzisz, żądanie wstępne jest ustalane, gdy chcesz złożyć żądanie między domenami. Inspekcja wstępna sprawdzi serwer pod kątem dostępnych opcji, a następnie zwróci nagłówki jako takie. Do czasu zakończenia inspekcji wstępnej żądanie nie zostanie rozwiązane w przeglądarkach opartych na przeglądarkach internetowych, aby uniknąć fałszowania między witrynami. [Więcej informacji na ten temat można znaleźć tutaj] (https://developer.mozilla.org/en-US/docs/HTTP/Access_control_CORS?redirectlocale=en-US&redirectslug=HTTP_access_control) – Ohgodwhy

Odpowiedz

0

Żądanie opcji PREFLIGHT jest automatycznie wykonywane na żądanie między domenami, jeśli żądanie nie jest prostym żądaniem. Prostym żądaniem jest zwykle żądanie GET. Tak więc, jeśli utworzysz żądanie GET w ramach domeny krzyżowej, NIE pojawi się żądanie preflight OPTIONS.

Jeśli jednak zostanie wykonane żądanie między domenami POST, przeglądarka wykona, bez uprzedniego polecenia, wykonanie żądania preflight. Celem tego żądania jest sprawdzenie, czy serwer zezwala na żądania domeny POST z domeną/adresem IP klienta.

Jeśli na serwerze znajduje się odpowiednia informacja "Kontrola dostępu" w nagłówku odpowiedzi, co oznacza, że ​​klient może wysyłać żądanie POST z różnych domen, wówczas przeglądarka wykona żądanie POST. Jeśli twój serwer mówi NIE (ponieważ nagłówki "Access-Control" na twoim serwerze są błędne), przeglądarka to uszanuje i NIE wykona drugiego żądania POST.

Aby uzyskać więcej informacji, patrz https://www.html5rocks.com/en/tutorials/cors/#toc-handling-a-not-so-simple-request.

Należy również upewnić się, że serwer jest ustawiony do obsługi przychodzących żądań OPTIONS.