Mam komputer w lokalnej sieci LAN (machineA), który ma dwa serwery WWW. Pierwszy to wbudowany w XBMC (na porcie 8080) i wyświetla naszą bibliotekę. Drugi serwer to skrypt Pythona CherryPy (port 8081), którego używam do wyzwalania konwersji plików na żądanie. Konwersja pliku jest wyzwalana przez żądanie AJAX POST ze strony obsługiwanej z serwera XBMC.
- Idź do http: // machineA: 8080, która wyświetla bibliotekę
- Wyświetlana jest biblioteka
- Użytkownik klika link „Konwertuj”, który wydaje następujące polecenie -
jQuery Ajax Request
$.post('http://machineA:8081', {file_url: 'asfd'}, function(d){console.log(d)})
- Przeglądarka wysyła żądanie OPCJE HTTP z następującymi nagłówkami;
Żądanie nagłówka - OPCJE
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://machineA:8080
Access-Control-Request-Method: POST
Access-Control-Request-Headers: x-requested-with
- Serwer odpowiada następującymi informacjami;
Nagłówek odpowiedzi - OPCJE (STATUS = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:40:29 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
- Następnie rozmowa się kończy. Przeglądarka powinna teoretycznie wysłać żądanie POST, ponieważ serwer odpowiedział poprawnymi (?) Nagłówkami CORS (Access-Control-Allow-Origin: *)
Do rozwiązywania problemów wydałem również to samo polecenie $ .post z http://jquery.com . To jest miejsce, w którym jestem zaskoczony, z jquery.com, żądanie postu działa, żądanie OPTIONS jest wysyłane po POST. Nagłówki tej transakcji znajdują się poniżej;
Żądanie nagłówka - OPCJE
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: http://jquery.com
Access-Control-Request-Method: POST
Nagłówek odpowiedzi - OPCJE (STATUS = 200 OK)
Content-Length: 0
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: text/html;charset=ISO-8859-1
Żądanie nagłówka - POST
Host: machineA:8081
User-Agent: ... Firefox/4.01
Accept: */*
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://jquery.com/
Content-Length: 12
Origin: http://jquery.com
Pragma: no-cache
Cache-Control: no-cache
Nagłówek odpowiedzi - POST (STATUS = 200 OK)
Content-Length: 32
Access-Control-Allow-Headers: *
Access-Control-Max-Age: 1728000
Server: CherryPy/3.2.0
Date: Thu, 21 Apr 2011 22:37:59 GMT
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Content-Type: application/json
Nie mogę zrozumieć, dlaczego to samo żądanie zadziała z jednej strony, ale nie z drugiej. Mam nadzieję, że ktoś będzie w stanie wskazać, czego mi brakuje. Dzięki za pomoc!
Odpowiedzi:
W końcu natknąłem się na ten link „ Żądanie CORS POST działa ze zwykłego javascript, ale dlaczego nie z jQuery? ”, Który zauważa, że jQuery 1.5.1 dodaje
nagłówek do wszystkich żądań CORS. jQuery 1.5.2 tego nie robi. Ponadto, zgodnie z tym samym pytaniem, ustawienie nagłówka odpowiedzi serwera na
nie pozwala na kontynuowanie odpowiedzi. Musisz upewnić się, że nagłówek odpowiedzi zawiera w szczególności wymagane nagłówki. to znaczy:
źródło
ŻĄDANIE:
ODPOWIEDŹ:
źródło
Rozwiązałem swój problem podczas korzystania z interfejsu API Google Matrix Distance, ustawiając nagłówek żądania za pomocą Jquery ajax. spójrz poniżej.
Uwaga, co dodałem w ustawieniach
**
**
Mam nadzieję, że to pomoże.
źródło
Trochę mi zajęło znalezienie rozwiązania.
Jeśli Twój serwer odpowiada poprawnie, a żądanie jest problemem, dodaj
withCredentials: true
doxhrFields
żądania:źródło
withCredentials: true
? na pewno masz odpowiednie nagłówki?,
jquery version: 3.2.1`. W rzeczywistości działa za pośrednictwem listonosza, ale nie przechodzi przez przeglądarkę ChromeCóż, walczyłem z tym problemem przez kilka tygodni.
Najłatwiejszym, najbardziej zgodnym i niehackującym sposobem jest prawdopodobnie skorzystanie z API JavaScript dostawcy, który nie wykonuje wywołań przeglądarki i obsługuje żądania Cross Origin.
Np. Facebook JavaScript API i Google JS API.
Jeśli Twój dostawca interfejsu API nie jest aktualny i nie obsługuje w odpowiedzi nagłówka „Origin Origin Resource Origin” * i nie ma interfejsu API JS (tak, mówię o tobie Yahoo), pojawia się jedna z trzech opcji -
Użycie jsonp w twoich żądaniach, które dodaje funkcję zwrotną do twojego adresu URL, gdzie możesz obsłużyć swoją odpowiedź. Zastrzeżenie to spowoduje zmianę adresu URL żądania, więc serwer interfejsu API musi być wyposażony do obsługi wywołania zwrotnego? Na końcu adresu URL.
Wyślij żądanie na serwer API, który jest kontrolerem przez Ciebie i znajduje się w tej samej domenie co klient lub ma włączone współużytkowanie zasobów między źródłami, z którego możesz proxy proxy do serwera API innej firmy.
Prawdopodobnie najbardziej przydatny w przypadkach, gdy wysyłasz żądania OAuth i potrzebujesz obsługi interakcji z użytkownikiem Haha!
window.open('url',"newwindowname",'_blank', 'toolbar=0,location=0,menubar=0')
źródło
Używanie tego w połączeniu z Laravelem rozwiązało mój problem. Wystarczy dodać ten nagłówek do żądania jquery
Access-Control-Request-Headers: x-requested-with
i upewnić się, że odpowiedź po stronie serwera ma ustawiony ten nagłówekAccess-Control-Allow-Headers: *
.źródło
Access-Control-Allow-Headers
i dostarczeniem poprawnego JQAccess-Control-Request-Headers
(plus dowolne dodane przez kod), z których żadna nie może być symbolami wieloznacznymi. do wysadzenia przed lotem potrzebny jest tylko jeden „zły” nagłówek, np. użycieIf-None-Match
warunkowego GET, jeśli serwer nie ma tego na liście.Z jakiegoś powodu pytanie dotyczące żądań GET zostało połączone z tym, więc odpowiem na to tutaj.
Ta prosta funkcja asynchronicznie otrzyma odpowiedź HTTP ze strony obsługującej CORS. Jeśli go uruchomisz, zobaczysz, że tylko strona z właściwymi nagłówkami zwraca status 200, jeśli jest dostępny poprzez XMLHttpRequest - niezależnie od tego, czy użyto GET, czy POST. Nic nie można zrobić po stronie klienta, aby obejść ten problem, z wyjątkiem użycia JSONP, jeśli potrzebujesz tylko obiektu json.
Poniższe elementy można łatwo zmodyfikować, aby dane były przechowywane w obiekcie xmlHttpRequestObject:
źródło
Miałem dokładnie ten sam problem, w którym jquery ajax dawało mi tylko problemy z corsami w żądaniach postów, w których żądania get działały dobrze - zmęczyłem wszystko powyżej bez rezultatów. Miałem właściwe nagłówki na moim serwerze itp. Przejście na używanie XMLHTTPRequest zamiast jquery natychmiast rozwiązało mój problem. Bez względu na to, której wersji jquery użyłem, nie naprawiłem tego. Pobieranie działa również bez problemów, jeśli nie potrzebujesz zgodności z poprzednimi przeglądarkami.
Mam nadzieję, że pomoże to każdemu, kto ma te same problemy.
źródło
Oto podsumowanie tego, co zadziałało dla mnie:
Zdefiniuj nową funkcję (opakowaną w
$.ajax
celu uproszczenia):Stosowanie:
Współpracuje również z
.done
,.fail
itp:Po stronie serwera (w tym przypadku, gdzie hostowany jest przyklad.com), ustaw te nagłówki (dodano przykładowy kod w PHP):
To jedyny znany mi sposób, aby naprawdę POST między domenami z JS.
JSONP konwertuje POST na GET, który może wyświetlać poufne informacje w logach serwera.
źródło
Jeśli z jakichś powodów przy dodawaniu nagłówków lub ustawianiu zasad kontroli nadal nic nie dochodzi, możesz rozważyć użycie Apache ProxyPass…
Na przykład w jednym
<VirtualHost>
korzystającym z protokołu SSL dodaj dwie następujące dyrektywy:Upewnij się, że załadowane są następujące moduły Apache (załaduj je za pomocą a2enmod):
Oczywiście musisz zmienić adres URL żądań AJAX, aby korzystać z serwera proxy Apache…
źródło
Jest trochę późno na imprezę, ale zmagam się z tym od kilku dni. Jest to możliwe i żadna z odpowiedzi, które tu znalazłem, nie zadziałała. To jest zwodniczo proste. Oto połączenie .ajax:
Oto php po stronie serwera:
źródło
$.ajax()
pomocą poprawnie skonfigurowanego serwera. Najtrudniejszą częścią jest uzyskanieAccess-Control-Request-Headers
prawidłowego, ale nawet to nie jest zbyt trudne. Jak zauważono w poprzednich plakatach, nie może to być symbol wieloznaczny, ale biała lista nagłówków.