Problem z tym, co uważałem za stosunkowo prostą wtyczkę jQuery ...
Wtyczka powinna pobrać dane ze skryptu php poprzez ajax, aby dodać opcje do <select>
. Żądanie ajax jest dość ogólne:
$.ajax({
url: o.url,
type: 'post',
contentType: "application/x-www-form-urlencoded",
data: '{"method":"getStates", "program":"EXPLORE"}',
success: function (data, status) {
console.log("Success!!");
console.log(data);
console.log(status);
},
error: function (xhr, desc, err) {
console.log(xhr);
console.log("Desc: " + desc + "\nErr:" + err);
}
});
Wygląda na to, że działa dobrze w Safari. W przeglądarce Firefox 3.5 REQUEST_TYPE
na serwerze są zawsze „OPCJE”, a dane $ _POST nie są wyświetlane. Apache rejestruje żądanie jako typ „OPCJE”:
::1 - - [08/Jul/2009:11:43:27 -0500] "OPTIONS sitecodes.php HTTP/1.1" 200 46
Dlaczego to wywołanie ajax miałoby działać w przeglądarce Safari, ale nie w Firefoksie, i jak to naprawić w przeglądarce Firefox?
Nagłówki odpowiedzi Data: środa, 08 lipca 2009 21:22:17 GMT Serwer: Apache / 2.0.59 (Unix) PHP / 5.2.6 DAV / 2 X-Powered-By: PHP / 5.2.6 Długość treści 46 Limit czasu podtrzymania = 15, maks. = 100 Połączenie Keep-Alive Content-Type text / html Żądaj nagłówków Formularz zamówienia hosta: 8888 User-Agent Mozilla / 5.0 (Macintosh; U; Intel Mac OS X 10.5; en-US; rv: 1.9.1) Gecko / 20090624 Firefox / 3.5 Akceptuj tekst / html, application / xhtml + xml, application / xml; q = 0,9, * / *; q = 0,8 Accept-Language en-us, en; q = 0,5 Zaakceptuj kodowanie gzip, deflate Accept-Charset ISO-8859-1, utf-8; q = 0,7, *; q = 0,7 Keep-Alive 300 Połączenie utrzymuje się przy życiu Pochodzenie http://ux.inetu.act.org Kontrola dostępu-żądanie-metoda POST Access-Control-Request-Headers x-Request-with
Oto zdjęcie wyjścia Firebuga:
ajax
firefox
jquery-plugins
jquery
fitzgeraldsteele
źródło
źródło
Odpowiedzi:
Przyczyną błędu są te same zasady pochodzenia. Pozwala tylko na wykonywanie zapytań XMLHTTP we własnej domenie. Sprawdź, czy możesz zamiast tego użyć wywołania zwrotnego JSONP :
źródło
Użyłem następującego kodu po stronie Django, aby zinterpretować żądanie OPTIONS i ustawić wymagane nagłówki kontroli dostępu. Po tym zaczęły działać moje żądania między domenami z Firefoksa. Jak wspomniano wcześniej, przeglądarka najpierw wysyła żądanie OPCJE, a następnie natychmiast POST / GET
Edycja: wydaje się, że przynajmniej w niektórych przypadkach należy dodać te same nagłówki kontroli dostępu do rzeczywistej odpowiedzi. Może to być nieco mylące, ponieważ żądanie wydaje się skuteczne, ale Firefox nie przekazuje treści odpowiedzi do Javascript.
źródło
Access-Control-Allow-Headers
powinien zawierać wartośćx-csrf-token
, a niex-csrftoken
.W tym artykule Centrum deweloperów mozilla opisano różne scenariusze żądań między domenami. Artykuł wydaje się wskazywać, że żądanie POST z typem treści „application / x-www-form-urlencoded” powinno być wysyłane jako „proste żądanie” (bez żądania OPCJI „wstępnej kontroli”). Stwierdziłem jednak, że Firefox wysłał żądanie OPTIONS, mimo że mój test POST został wysłany z tym rodzajem treści.
Udało mi się to zrobić, tworząc moduł obsługi żądań opcji na serwerze, który ustawił nagłówek odpowiedzi „Access-Control-Allow-Origin” na „*”. Możesz być bardziej restrykcyjny, ustawiając go na coś konkretnego, np. „ Http://someurl.com ”. Przeczytałem również, że podobno można podać listę wielu źródeł oddzieloną przecinkami, ale nie udało mi się tego uruchomić.
Gdy Firefox otrzyma odpowiedź na żądanie OPCJE z akceptowalną wartością „Kontrola dostępu - Zezwalaj na pochodzenie”, wysyła żądanie POST.
źródło
Rozwiązałem ten problem za pomocą rozwiązania opartego całkowicie na Apache. W moim vhost / htaccess umieszczam następujący blok:
Ta druga część może nie być potrzebna, w zależności od tego, co się stanie, gdy Apache wykona skrypt docelowy. Zasługa przyjazny folk ServerFault do drugiej części.
źródło
Wydaje się, że ten PHP na górze odpowiadającego skryptu działa. (W przeglądarce Firefox 3.6.11. Nie przeprowadziłem jeszcze wielu testów).
źródło
GET
,POST
...) jest nieco zbyt wiele do mojego gustu. (I zastanawiam się, czy zawsze wysyłanie tych jest zgodne ze specyfikacjami?)Miałem ten sam problem z wysyłaniem żądań do map Google, a rozwiązanie jest dość proste z jQuery 1.5 - do użytku z dataType
dataType: "jsonp"
źródło
Culprit jest prośbą o przeprowadzenie inspekcji wstępnej przy użyciu metody OPTIONS
W przypadku metod żądań HTTP, które mogą powodować skutki uboczne na danych użytkownika (w szczególności w przypadku metod HTTP innych niż GET lub użycia POST z niektórymi typami MIME), specyfikacja wymaga, aby przeglądarki „wstępnie sprawdzały” żądanie, żądając obsługiwanych metod z serwer z metodą żądania OPCJE HTTP, a następnie, po „zatwierdzeniu” przez serwer, wysłanie rzeczywistego żądania za pomocą faktycznej metody żądania HTTP.
Specyfikacja sieciowa: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Rozwiązałem problem, dodając następujące wiersze w Nginx conf.
źródło
Przeglądałem źródło 1.3.2, gdy korzystam z JSONP, żądanie jest tworzone przez dynamiczne budowanie elementu SCRIPT, który mija zasady przeglądarki w tej samej domenie. Oczywiście nie można wykonać żądania POST przy użyciu elementu SCRIPT, przeglądarka pobierze wynik za pomocą GET.
Podczas żądania wywołania JSONP element SCRIPT nie jest generowany, ponieważ robi to tylko wtedy, gdy typ wywołania AJAX jest ustawiony na GET.
http://dev.jquery.com/ticket/4690
źródło
Mieliśmy taki problem z ASP.Net. Nasz IIS
$.post
zwracał wewnętrzny błąd serwera podczas próby wykonania jQuery w celu uzyskania zawartości HTML ze względu na PageHandlerFactory był ograniczony do odpowiadania tylko naGET,HEAD,POST,DEBUG
czasowniki. Możesz więc zmienić to ograniczenie, dodając czasownik „OPCJE” do listy lub wybierając „Wszystkie czasowniki”Możesz to zmienić w Menedżerze IIS, wybierając swoją stronę internetową, a następnie wybierając Mapowania modułu obsługi, dwukrotnie kliknij PageHandlerFactory dla plików * .apx zgodnie z potrzebami (korzystamy ze zintegrowanej puli aplikacji w środowisku 4.0). Kliknij Żądaj ograniczeń, a następnie przejdź do Tabn czasowników i zastosuj modyfikację.
Teraz nasza
$.post
prośba działa zgodnie z oczekiwaniami :)źródło
Sprawdź, czy
action
adres URL formularza zawierawww
część domeny, a otwarta strona oryginalna jest wyświetlana bezwww
.Zazwyczaj wykonywane dla kanonicznych adresów URL ..
Walczyłem przez wiele godzin, zanim natknąłem się na ten artykuł i znalazłem ślad Cross Domain.
źródło
Wydaje mi się, że jeśli
o.url = 'index.php'
i ten plik istnieje, to jest w porządku i zwracam komunikat o powodzeniu w konsoli. Zwraca błąd, jeśli używam adresu URL:http://www.google.com
Jeśli wykonujesz żądanie postu, dlaczego nie użyć bezpośrednio metody $ .post :
To jest o wiele prostsze.
źródło
Opublikowałem wyraźny przykład rozwiązania tego problemu, jeśli kontrolujesz kod serwera domeny, do której POSTingujesz. Ta odpowiedź została poruszona w tym wątku, ale jaśniej to wyjaśnia IMO.
Jak wysłać zapytanie POST między domenami za pomocą JavaScript?
źródło
Rozwiązaniem tego jest:
json
&callback=?
do swojego adresu URLdziałało to na wywołanie Facebook API i Firefox. Firebug używa
GET
zamiastOPTIONS
powyższych warunków (oba).źródło
Inną możliwością obejścia problemu jest użycie skryptu proxy. Metodę tę opisano na przykład tutaj
źródło
Czy możesz tego spróbować bez
contentType:application/x-www-form-urlencoded
źródło
Spróbuj dodać opcję:
dataType: „json”
źródło
źródło
Miałem podobny problem z próbą użycia API Facebooka.
Jedynym contentType, który nie wysłał żądania inspekcji wstępnej, wydawał się być tylko tekst / zwykły ... a nie reszta parametrów wymienionych tutaj w mozilli
FYI: Wspomniany dokument Moz sugeruje, że nagłówki X-Lori powinny wyzwalać żądanie inspekcji wstępnej ... tak nie jest.
źródło
Musisz trochę popracować po stronie serwera. Widzę, że używasz PHP po stronie serwera, ale rozwiązanie dla aplikacji .NET jest tutaj: Nie można ustawić typu zawartości na 'application / json' w jQuery.ajax
Zrób to samo w skrypcie PHP i będzie działać. Po prostu: na pierwsze żądanie przeglądarka pyta serwer, czy wolno przesyłać takie dane tego typu, a drugie żądanie jest prawidłowe / dozwolone.
źródło
Spróbuj dodać następujące:
źródło
Użyłem adresu URL serwera proxy, aby rozwiązać podobny problem, gdy chcę wysłać dane do mojego apache solr hostowanego na innym serwerze. (To może nie być idealna odpowiedź, ale rozwiązuje mój problem).
Śledź ten adres URL: Używając Mode-Rewrite do proxy , dodaję ten wiersz do mojego httpd.conf:
Dlatego mogę po prostu wysyłać dane do / solr zamiast wysyłać dane do http: // ip: 8983 / solr / *. Następnie będzie publikować dane tego samego źródła.
źródło
Mam już ten kod dobrze radzący sobie z moją sytuacją cors w php:
I działało dobrze lokalnie i zdalnie, ale nie do przesyłania w trybie zdalnym.
Coś się stało z apache / php LUB moim kodem, nie zadałem sobie trudu, aby go wyszukać, gdy poprosisz o OPCJE, zwraca mój nagłówek z regułami cors, ale z wynikiem 302. Dlatego moja przeglądarka nie rozpoznaje jako akceptowalnej sytuacji.
To, co zrobiłem, na podstawie odpowiedzi @ Mark McDonald, to po prostu wstawienie tego kodu za moim nagłówkiem:
Teraz, gdy poprosisz
OPTIONS
, wyśle tylko nagłówek i wynik 202.źródło
Informujemy:
JSONP obsługuje tylko metodę żądania GET.
* Wyślij zapytanie przez firefox : *
Powyższe żądanie wysłane przez OPCJE (while ==> wpisz: „POST” ) !!!!
Ale powyżej żądanie wysyłane przez GET (while ==> wpisz: „POST” ) !!!!
Podczas „komunikacji między domenami” zwracaj uwagę i zachowaj ostrożność.
źródło