Otrzymuję ten błąd, używając ngResource do wywołania interfejsu API REST w Amazon Web Services:
XMLHttpRequest nie może załadować http://server.apiurl.com:8000/s/login?login=facebook . Odpowiedź na żądanie inspekcji wstępnej nie przechodzi kontroli kontroli dostępu: Żądany zasób nie zawiera nagłówka „Kontrola dostępu - Zezwalaj na pochodzenie”. Dlatego źródło „ http: // localhost ” nie ma dostępu. Błąd 405
Usługa:
socialMarkt.factory('loginService', ['$resource', function($resource){
var apiAddress = "http://server.apiurl.com:8000/s/login/";
return $resource(apiAddress, { login:"facebook", access_token: "@access_token" ,facebook_id: "@facebook_id" }, {
getUser: {method:'POST'}
});
}]);
Kontroler:
[...]
loginService.getUser(JSON.stringify(fbObj)),
function(data){
console.log(data);
},
function(result) {
console.error('Error', result.status);
}
[...]
Używam Chrome i nie wiem, co jeszcze zrobić, aby rozwiązać ten problem. Skonfigurowałem nawet serwer, aby akceptował nagłówki z miejsca pochodzenia localhost
.
javascript
ajax
http
cors
http-status-code-405
Andre Mendes
źródło
źródło
Odpowiedzi:
Występują problemy z CORS.
Istnieje kilka sposobów rozwiązania tego problemu.
Mówiąc dokładniej, próbujesz uzyskać dostęp do api.serverurl.com z localhost. To jest dokładna definicja żądania między domenami.
Wyłączając go tylko po to, aby wykonać swoją pracę (OK, zapewnij słabe bezpieczeństwo, jeśli odwiedzasz inne witryny i po prostu rzucisz puszkę w dół drogi), możesz użyć serwera proxy, który sprawia, że przeglądarka myśli, że wszystkie żądania pochodzą od lokalnego hosta, gdy naprawdę masz serwer lokalny, który następnie wywołuje serwer zdalny.
więc api.serverurl.com może stać się localhost: 8000 / api, a lokalny nginx lub inny serwer proxy wyśle do właściwego miejsca docelowego.
Teraz popularne zapotrzebowanie, 100% więcej informacji o CORS .... ten sam wspaniały smak!
A dla downvoters ... omijanie CORS jest dokładnie tym, co pokazano dla tych, którzy po prostu uczą się interfejsu. https://codecraft.tv/courses/angular/http/http-with-promises/
źródło
Mój „Serwer API” to aplikacja PHP, więc aby rozwiązać ten problem, znalazłem poniższe rozwiązanie do pracy:
Umieść linie w index.php
źródło
Access-Control-Allow-Headers
.W interfejsie internetowym AspNetCore ten problem został rozwiązany przez dodanie „Microsoft.AspNetCore.Cors” (wer. 1.1.1) i dodanie poniższych zmian w Startup.cs.
i
i wprowadzenie
[EnableCors("AllowAllHeaders")]
kontrolera.źródło
Istnieją pewne zastrzeżenia, jeśli chodzi o CORS. Po pierwsze, nie pozwala na używanie symboli wieloznacznych,
*
ale nie trzymaj mnie tego, gdzieś go przeczytałem i nie mogę teraz znaleźć artykułu.Jeśli wysyłasz żądania z innej domeny, musisz dodać nagłówki zezwolenia na początek.
Jeśli dokonujesz wnioski, które wpływają na zasoby serwera jak POST / PUT / patch, a jeśli MIME typu jest inny niż poniżej
application/x-www-form-urlencoded
,multipart/form-data
lubtext/plain
przeglądarka będzie automatycznie dokonać OPCJE przed lotem zażądać, aby skontaktować się z serwerem, jeśli byłoby to pozwolić .Tak więc Twój interfejs API / serwer musi odpowiednio obsłużyć żądania OPCJI, musisz odpowiedzieć
access control headers
odpowiednim kodem stanu odpowiedzi HTTP200
.Nagłówki powinny wyglądać mniej więcej tak: dostosuj je do swoich potrzeb:
Nagłówek maksymalnego wieku jest ważny, w moim przypadku nie działałby bez niego, myślę, że przeglądarka potrzebuje informacji o tym, jak długo ważne są „prawa dostępu”.
Ponadto, jeśli składasz np.
POST
Żądanie za pomocąapplication/json
mima z innej domeny, musisz również dodać wspomniany wcześniej nagłówek zezwolenia na początek, aby wyglądało to tak:Gdy lot przed lotem zakończy się powodzeniem i otrzyma wszystkie potrzebne informacje, zostanie wysłane aktualne żądanie.
Ogólnie rzecz biorąc,
Access-Control
w odpowiedzi należy podać wszelkie nagłówki w żądaniu początkowym lub przed lotem, aby zadziałało.Jest dobry przykład w dokumentach MDN tutaj na ten link , i powinieneś również sprawdzić ten post SO
źródło
.AllowCredentials()
. Po dodaniu.AllowCredentials()
wszystko działało.Źródło: https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
Musisz wysłać nagłówek HTTP Access-Control-Allow-Origin: * ze strony serwera.
Jeśli używasz Apache jako serwera HTTP, możesz dodać go do pliku konfiguracyjnego Apache w następujący sposób:
Mod_headers jest domyślnie włączony w Apache, jednak możesz chcieć upewnić się, że jest włączony, uruchamiając:
źródło
/etc/apache2/apache2.conf
Jeśli piszesz rozszerzenie chrome
Musisz dodać
manifest.json
uprawnienia do swojej domeny (domen).źródło
Jeśli używasz serwera IIS przez przypadek. możesz ustawić poniżej nagłówków w opcji nagłówków żądań HTTP.
z tym wszystkim postem, get itp. będzie działać dobrze.
źródło
W przypadku serwera kolby python można użyć wtyczki flask-cors, aby włączyć żądania między domenami.
Zobacz: https://flask-cors.readthedocs.io/en/latest/
źródło
W PHP możesz dodać nagłówki:
źródło
header ("Access-Control-Expose-Headers: Content-Length, X-JSON");
Aby rozwiązać problemy z żądaniami krzyżowania pochodzenia w aplikacji Node JS:
I po prostu dodaj poniższe linie do
app.js
źródło
W moim pliku konfiguracyjnym Apache VirtualHost dodałem następujące linie:
źródło
Dla tych, którzy używają Lambda Integrated Proxy z API Gateway . Musisz skonfigurować swoją funkcję lambda tak, jakbyś przesyłał do niej swoje żądania bezpośrednio, co oznacza, że funkcja powinna poprawnie skonfigurować nagłówki odpowiedzi. (Jeśli korzystasz z niestandardowych funkcji lambda, będzie to obsługiwane przez bramę API).
źródło
Myślę, że wyłączenie CORS z Chrome nie jest dobrym sposobem , ponieważ jeśli używasz go w trybie jonowym, z pewnością w Mobile Build problem znów się pojawi.
Więc lepiej naprawić w swoim backend.
Po pierwsze W nagłówku należy ustawić-
A jeśli API zachowuje się zarówno jako GET, jak i POST, ustaw także w nagłówku
źródło
Bardzo częstą przyczyną tego błędu może być to, że interfejs API hosta zamapował żądanie na metodę http (np. PUT), a klient API wywołuje interfejs API przy użyciu innej metody http (np. POST lub GET)
źródło
PUT
metodęNasz zespół czasami widzi to za pomocą Vue, axios i C # WebApi. Dodanie atrybutu trasy w punkcie końcowym, który próbujesz trafić, naprawia go dla nas.
źródło
Napotkałem ten problem, gdy serwer DNS był ustawiony na 8.8.8.8 (Google). W rzeczywistości problem tkwił w routerze, moja aplikacja próbowała połączyć się z serwerem za pośrednictwem google, a nie lokalnie (w moim konkretnym przypadku). Usunąłem 8.8.8.8 i to rozwiązało problem. Wiem, że to problemy rozwiązane przez ustawienia CORS, ale może ktoś będzie miał takie same problemy jak ja
źródło
Używam AWS SDK do przesyłania, po spędzeniu czasu na wyszukiwaniu w Internecie natknąłem się na ten wątek. dzięki @lsimoneau 45581857 okazuje się, że działo się dokładnie to samo. Po prostu skierowałem swój adres URL żądania do regionu na moim wiadrze, dołączając opcję regionu i zadziałało.
źródło
Autonomiczne dystrybucje GeoServer obejmują serwer aplikacji Jetty. Włącz udostępnianie zasobów między źródłami (CORS), aby umożliwić aplikacjom JavaScript spoza własnej domeny korzystanie z GeoServer.
Odkomentuj następujące
<filter>
i<filter-mapping>
od webapps / geoserver / WEB-INF / web.xml:źródło
Łatwo jest rozwiązać ten problem zaledwie kilkoma krokami, nie martwiąc się o nic. Prosimy postępować zgodnie z instrukcjami, aby go rozwiązać.
źródło
Coś, co bardzo łatwo przeoczyć ...
W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt api. W oknie właściwości ustaw „Anonimowe uwierzytelnianie” na Włączone !!!
źródło
Wyłącz chromowane zabezpieczenie. Utwórz chromowane kliknięcie prawym przyciskiem myszy -> właściwości -> cel, wklej to „C: \ Program Files (x86) \ Google \ Chrome \ Application \ chrome.exe” - wyłącz-web-bezpieczeństwo - użytkownik -data-dir = "c: / chromedev"
źródło