Firefox „Cross-Origin Request Blocked” pomimo nagłówków

119

Próbuję wykonać proste żądanie między źródłami, a Firefox konsekwentnie blokuje je z tym błędem:

Zablokowano żądanie między źródłami: ta sama zasada dotycząca pochodzenia nie zezwala na odczytywanie zdalnego zasobu pod adresem [url]. Można to naprawić, przenosząc zasób do tej samej domeny lub włączając mechanizm CORS. [url]

Działa dobrze w Chrome i Safari.

O ile wiem, ustawiłem wszystkie poprawne nagłówki w moim PHP, aby to zadziałało. Oto, czym odpowiada mój serwer

HTTP/1.1 200 OK
Date: Mon, 23 Jun 2014 17:15:20 GMT
Server: Apache/2.2.22 (Debian)
X-Powered-By: PHP/5.4.4-14+deb7u8
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, POST, OPTIONS
Access-Control-Allow-Headers: Content-Type
Access-Control-Request-Headers: X-Requested-With, accept, content-type
Vary: Accept-Encoding
Content-Length: 186
Content-Type: text/html

Próbowałem użyć Angulara, jQuery i podstawowego obiektu XMLHTTPRequest, na przykład:

var data = "id=1234"
var request = new XMLHttpRequest({mozSystem: true})
request.onload = onSuccess;
request.open('GET', 'https://myurl.com' + '?' + data, true)
request.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
request.send()

... i działa w każdej przeglądarce poza Firefox. Czy ktoś może w tym pomóc?

Godwhacker
źródło
Czy możesz zapewnić pełny ślad wszystkich wniosków i odpowiedzi? Albo przynajmniej udostępnić witrynę testową? Jeśli witryna uzyskuje dostęp do zdalnego źródła http, https, plik? mozSystemnie jest obsługiwany w przypadku zwykłych witryn internetowych, które zawierają tylko spakowane aplikacje dla systemu Firefox , więc porzuć tę opcję.
nmaier
1
@nmaier Nagłówki podczas wysyłania jako POST, a nie GET: Accept application/json, text/plain, */* Accept-Encoding gzip, deflate Accept-Language en-US,en;q=0.5 Content-Length 35 Content-Type application/x-www-form-urlencoded; charset=UTF-8 Host [url] Origin [url] Referer [referrer url] User-Agent Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:30.0) Gecko/20100101 Firefox/30.0 Błąd: Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at [url]. This can be fixed by moving the resource to the same domain or enabling CORS. [url]
Godwhacker
2
@nmaier Właściwie wygląda na to, że jest to jakiś problem z certyfikatem bezpieczeństwa w witrynie, do której mam dostęp - Firefox po prostu podaje fałszywy błąd. Jeśli dodam witrynę do listy wyjątków, to działa dobrze.
Godwhacker

Odpowiedzi:

122

Okazuje się, że nie ma to nic wspólnego z CORS - był to problem z certyfikatem bezpieczeństwa. Wprowadzające w błąd błędy = 4 godziny bólu głowy.

Godwhacker
źródło
3
Właśnie miałem ten problem, błąd jest zbyt ogólny, a ponadto Chrome i Firefox używają różnych magazynów certyfikatów, więc trudniej jest debugować. Powinienem był podejrzewać, że mój serwer proxy nie przechwycił żadnych żądań OPCJI (przerywał przy uzgadnianiu SSL).
Daniel Correia
4
Godwhacker, być może mam ten sam problem. Jak się dowiedziałeś, że był to certyfikat bezpieczeństwa? Gdzie możesz to zobaczyć?
Leo
9
W moim przypadku miałem aplikację kątową wykonującą połączenia z innym serwerem, przy czym oba używały certyfikatów podpisanych wewnętrznie. Jednak Firefox nie ufa automatycznie certyfikatowi, ponieważ nie jest on rozpoznawany przez organ publiczny. Musiałem więc upewnić się, że certyfikaty dla obu serwerów zostały dodane jako wyjątki w przeglądarce Firefox, zanim ten problem zniknie.
Sam Storie
3
Dla mnie poprawką było ustawienie withCredentials=truena instancji XHR; w przeciwnym razie Firefox nie użył certyfikatu klienta podczas wysyłania żądania (jednak działał dobrze w Chrome).
Clint Harris
1
Komentarz @SamStorie brzmi bardziej jak odpowiedź niż ta odpowiedź. Dziękuję
Naga
26

Okazało się, że moim problemem było to, że serwer, do którego wysłałem żądanie krzyżowe, miał certyfikat, który nie był zaufany.

Jeśli chcesz połączyć się z domeną międzydomenową z https, musisz najpierw dodać wyjątek dla tego certyfikatu.

Możesz to zrobić, odwiedzając zablokowany link raz i dodając wyjątek.

Cracker0dks
źródło
5
Nie pomaga to szczególnie nikomu odwiedzającemu Twoją witrynę, chyba że z przyjemnością umieścisz tam wiadomość mówiącą „Jeśli używasz Firefoksa, przejdź do tej witryny i dodaj ją do listy wyjątków”
Godwhacker
@ Cracker0dks "odwiedź zablokowany link raz i dodaj wyjątek" czy możesz wyjaśnić, gdzie dodać wyjątek? Używam Firefox Quantum. TIA
Paul
1
przeglądasz łącze, na które Firefox narzeka bezpośrednio. Następnie otrzymasz ostrzeżenie o certyfikacie. Zezwól na certyfikat. Odwiedź ponownie swoją witrynę główną.
Cracker0dks
26

Natknąłem się na to pytanie, ponieważ stwierdziłem, że żądania w przeglądarce Firefox są blokowane z komunikatem:

Przyczyna: żądanie CORS nie powiodło się

Po wyjęciu sobie włosów dowiedziałem się, że nowo zainstalowane rozszerzenie Firefox, Privacy Badger, blokuje żądania.

Jeśli dojdziesz do tego pytania po podrapaniu się w głowę, spróbuj sprawdzić, jakie rozszerzenia zainstalowałeś, aby zobaczyć, czy któreś z nich blokuje żądania.

Zobacz Przyczyna: żądanie CORS nie powiodło się na MDN, aby uzyskać szczegółowe informacje.

Profesor programowania
źródło
skąd wiesz, które rozszerzenie blokuje żądania? Mam ten sam problem, ponieważ żądanie kończy się sukcesem w przeglądarce Firefox z nowym profilem (więc bez rozszerzeń)
Ciprian Tomoiagă
1
Kliknąłem każde rozszerzenie, aby sprawdzić, czy nie było wzmianek o blokowaniu treści w konkretnej witrynie, z którą miałem problem. Ghostery miał wpis, więc oznaczyłem witrynę jako zaufaną, załadowałem ją ponownie i żądania się powiodły.
Profesor programowania
1
Dziękuję Ci! Odkryłem również rozszerzenie Project Insight, które zawiera przegląd uprawnień wszystkich rozszerzeń. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă
1
@awendt Oof. Prywatność Badger też dla mnie. Dzięki.
Jason Leach
12

Jeśli nie masz `` prawdziwego '' certyfikatu (a zatem używasz certyfikatu z podpisem własnym), w FireFox możesz przejść do:

Options > Privacy & Security > (scroll to the bottom) View Certificates > Add Exception.

Tam podaj lokalizację, np .: https: //wwww.myserver: myport

Hypenate
źródło
zadziałało to dla mnie, gdy mój CORS działa we wszystkich innych przeglądarkach z wyjątkiem Firefoksa z błędem -> Zablokowano żądanie między źródłami: ta sama zasada pochodzenia nie zezwala na odczytywanie zdalnego zasobu pod adresem localhost: 44304 / v1 / search . (Przyczyna: żądanie CORS nie powiodło się).
JGilmartin
5

Tylko słowo ostrzeżenia. W końcu udało mi się obejść problem z przeglądarką Firefox i CORS.

Rozwiązaniem dla mnie był ten post

Ustawienie CORS (współdzielenie zasobów między źródłami) na serwerze Apache z poprawnymi nagłówkami odpowiedzi umożliwiającymi wszystkim | Benjamin Horn

Jednak Firefox zachowywał się naprawdę, naprawdę dziwnie po ustawieniu tych nagłówków na serwerze Apache (w folderze .htaccess).

Dodałem dużo console.log("Hi FF, you are here A")itp., Żeby zobaczyć, co się dzieje.

Z początku wyglądał, jakby wisiał xhr.send(). Ale potem odkryłem, że nie dotarło do tego stwierdzenia. Postawiłem console.logtuż przed nim i nie dotarłem - mimo że między ostatnim console.loga nowym nie było nic . Po prostu zatrzymał się między dwoma console.log.

Zmiana kolejności wierszy, usuwanie, aby sprawdzić, czy w pliku nie ma dziwnych znaków. Nic nie znalazłem.

Ponowne uruchomienie Firefoksa rozwiązało problem.

Tak, powinienem zgłosić błąd. Po prostu jest tak dziwny, więc nie wiem, jak go odtworzyć.

UWAGA : I, och, po prostu wykonałem Header always setczęści, a nie Rewrite*część!

Lew
źródło
W zasadzie ta sama historia dla mnie dzisiaj. Ponowne uruchomienie Firefoksa naprawiło to. Ponad 5 lat później.
Søren Mortensen
3

Poprostu dodaj

<IfModule mod_headers.c>
    Header set Access-Control-Allow-Origin "*"
</IfModule>

do .htaccesspliku w katalogu głównym witryny, z którą próbujesz się połączyć.

Gareth
źródło
To dobrze, jeśli chcesz ustawić akceptowanie żądań z dowolnego miejsca; nie dobrze, jeśli tego nie zrobisz, czyli cały punkt nagłówka.
Godwhacker,
2

Dla potomności sprawdź także dzienniki serwera, aby zobaczyć, czy żądany zasób zwraca 200.

Napotkałem podobny problem, w którym wszystkie właściwe nagłówki były zwracane w żądaniu ajax przed lotem, ale przeglądarka zgłosiła, że ​​rzeczywiste żądanie zostało zablokowane z powodu złych nagłówków CORS.

Okazuje się, że żądana strona zwróciła błąd 500 z powodu złego kodu, ale tylko wtedy, gdy została pobrana przez CORS. Przeglądarka (zarówno Chrome, jak i Firefox) omyłkowo zgłosiła brak nagłówka Access-Control-Allow-Origin zamiast powiedzieć, że strona zwróciła 500.

Jack Stouffer
źródło
1

Spróbuj tego, to powinno rozwiązać twój problem

  1. W swoim config.php dodaj www pre w swojej domenie.com. Na przykład:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Dodaj to do swojego pliku .htaccess

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]
Dharmendra Manikpuri
źródło
1

Dla mnie okazuje się, że Access-Control-Allow-Originustawiłem nagłówek odpowiedzi na konkretny (i poprawny), host.comale musiał on zostać zwrócony jako http://host.comzamiast tego. Co robi Firefox? Po cichu połyka żądanie GET i zwraca status 0 do XHR, bez żadnych ostrzeżeń wysyłanych do konsoli javascript, podczas gdy w przypadku innych podobnych błędów przynajmniej coś powie. Ai ai.

rogerdpack
źródło
1
Wygląda na to, że schemat jest oczekiwany, patrząc na przykłady na w3.org/TR/cors, ale w każdym razie dzięki, zrobiłem też źle i tak, brakuje komunikatu o błędzie Firefoksa.
Richard Green
1

Aby debugować, sprawdź dzienniki serwera, jeśli to możliwe. Firefox zwraca błędy CORS w konsoli z wielu różnych powodów.

Jednym z powodów jest także wtyczka uMatrix (i chyba NoScript i podobne).

johndodo
źródło
0

Miałem podobny problem i myślę, że warto zarejestrować się, jak to naprawiłem:

Mam system zbudowany w zasadzie na Symfony 3. Dla celów samodzielnej nauki i wydajności zdecydowałem się napisać kilka skryptów używając GoLang, także API z publicznym dostępem.

My Go API oczekuje parametrów formatu Json, a także zwraca odpowiedź w formacie Json

Aby nazwać te GoApi, których używam, w większości, $ .ajax (jQuery) Pierwszy test był oszustwem: (nie) słynne "Zablokowano żądanie Cross-Origin"! Następnie próbowałem ustawić „Access-Control-Allow-Origin: *” na apache conf, htaccess, php, javascript i gdziekolwiek mogłem znaleźć w google!

Ale nawet ten sam frustrujący błąd !!!

Rozwiązanie było proste: musiałem wysyłać żądania „POST” zamiast „GET”.

Aby to osiągnąć, musiałem dostosować zarówno GoLang, jak i JavaScript do korzystania z GET! Gdy to zrobię, żadne żądanie cross-Origin nie będzie już blokowane !!!

Mam nadzieję, że to pomoże

PS:

Używam Apache i Vhost na Directory Block, który mam

  Header always set Access-Control-Allow-Origin "*"
  Header always set Access-Control-Allow-Methods "POST, GET, OPTIONS, DELETE, PUT"

Pamiętaj: „*” oznacza, że ​​będziesz akceptować prośby od każdego !!! (Co może oznaczać brak bezpieczeństwa) W moim przypadku jest to w porządku, ponieważ będzie to publiczne API

PS2: Moje nagłówki

Nagłówki odpowiedzi

Access-Control-Allow-Credentials    true
Access-Control-Allow-Headers    Authorization
Access-Control-Allow-Methods    GET, POST, PUT
Access-Control-Allow-Origin http://localhost
Content-Length  164
Content-Type    application/json; charset=UTF-8
Date    Tue, 07 May 2019 20:33:52 GMT

Żądanie nagłówków (469 B)

Accept  application/json, text/javascript, */*; q=0.01
Accept-Encoding gzip, deflate
Accept-Language en-US,en;q=0.5
Connection  keep-alive
Content-Length  81
Content-Type    application/x-www-form-urlencoded; charset=UTF-8
Host    localhost:9003
Origin  http://localhost
Referer http://localhost/fibootkt/MY_app_dev.php/MyTest/GoAPI
User-Agent  Mozilla/5.0 (Macintosh; Intel …) Gecko/20100101 Firefox/66.0
Diego Favero
źródło
0

Jeśli powyższe odpowiedzi nie pomogą, sprawdź, czy serwer zaplecza działa, czy nie, ponieważ w moim przypadku nastąpiła awaria serwera i ten błąd okazuje się całkowicie mylący.

Neeraj Sewani
źródło
0

W moim przypadku był to mój ADBLOCKER ! Z jakiegoś powodu został włączony na moim hoście lokalnym i spowodował ten błąd w przeglądarce Firefox.

Wyłączenie go lub odinstalowaniu ten plugin powinien to naprawić.

W twoim przypadku może to nie być adblocker, ale inna wtyczka Firefox. Najpierw przetestuj to w trybie incognito bez wtyczek, aby określić, czy to jest problem, a następnie systematycznie wyłączaj wtyczki, aż znajdziesz winowajcę.

Christian Heath
źródło
-3

Pliki są oczywiste. Utwórz plik, nazwij go dowolnie. W moim przypadku jq2.php.

<html>
<head>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script>
    // document is made ready so that the program starts when we load this page       
    $(document).ready(function(){

        // it tells that any key activity in the "subcat_search" filed will execute the query.
        $("#subcat_search").keyup(function(){

            // we assemble the get link for the direction to our engine "gs.php". 
            var link1 = "http://127.0.0.1/jqm/gs.php?needle=" + $("#subcat_search").val();

            $.ajax({
                url: link1,
                // ajax function is called sending the input string to "gs.php".
                success: function(result){
                    // result is stuffed in the label.
                    $("#search_val").html(result);
                }
            });
        })   

    });
</script>
</head>

<body>

<!-- the input field for search string -->
<input type="text" id="subcat_search">
<br>
<!-- the output field for stuffing the output. -->
<label id="search_val"></label>

</body>
</html>

Teraz dodamy silnik, utworzymy plik, nazwij go jak chcesz. W moim przypadku jest to gs.php.

$head = "https://maps.googleapis.com/maps/api/place/textsearch/json?query="; //our head
$key = "your key here"; //your key
$hay = $_GET['needle'];

$hay = str_replace(" ", "+", $hay); //replacing the " " with "+" to design it as per the google's requirement 
$kill = $head . $hay . "&key=" . $key; //assembling the string in proper way . 
print file_get_contents($kill);

Starałem się, aby przykład był tak prosty, jak to tylko możliwe. A ponieważ wykonuje odsyłacz przy każdym naciśnięciu klawisza, przydział Twojego interfejsu API zostanie zużyty dość szybko.

Oczywiście nie ma końca rzeczy, które możemy zrobić, jak umieszczanie danych w tabeli, wysyłanie do bazy danych i tak dalej.

Surowe Mehta
źródło
Prosimy nie publikować tej samej odpowiedzi więcej niż jeden raz. Upewnij się, że Twoja odpowiedź faktycznie odpowiada na pytanie. Jeśli chcesz skierować kogoś w inne miejsce, aby uzyskać więcej informacji, nie jest to dobra odpowiedź.
elixenide
Witam, użyłem linku, ponieważ zawiera więcej informacji, takich jak wymagania wstępne itp. Jeśli uznasz to za stosowne, usunę je.
Harsh Mehta,