Başlıklara rağmen Firefox 'Çapraz Kaynak İsteği Engellendi'


119

Kaynaklar arası basit bir istekte bulunmaya çalışıyorum ve Firefox bu hatayı sürekli olarak engelliyor:

Kaynaklar Arası İstek Engellendi: Aynı Kaynak İlkesi, [url] adresindeki uzak kaynağın okunmasına izin vermez. Bu, kaynak aynı etki alanına taşınarak veya CORS etkinleştirilerek düzeltilebilir. [URL]

Chrome ve Safari'de iyi çalışıyor.

Anlayabildiğim kadarıyla, bunun çalışmasına izin vermek için PHP'de tüm doğru başlıkları ayarladım. İşte sunucumun yanıt verdiği şey

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

Angular, jQuery ve temel bir XMLHTTPRequest nesnesini kullanmayı denedim, örneğin:

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()

... ve Firefox hariç her tarayıcıda çalışır. Biri buna yardımcı olabilir mi?


Tüm istek ve yanıtların tam bir izini sağlayabilir misiniz? Veya en azından bir test sitesi mi sunuyorsunuz? Web sitesi uzak kaynaklı http, https, dosyaya erişiyorsa? mozSystemsadece firefox-os uygulamaları paketlenmiş normal web siteleri için desteklenmez , bu nedenle bu seçeneği bırakın.
nmaier

1
@nmaier GET yerine POST olarak gönderirken başlıklar: 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 Hata: 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 Aslında bu, eriştiğim sitedeki güvenlik sertifikasıyla ilgili bir tür sorun gibi görünüyor - Firefox sadece sahte bir hata veriyor. Siteyi istisnalar listesine eklersem iyi çalışıyor.
Godwhacker

Yanıtlar:


122

Bunun CORS ile hiçbir ilgisi olmadığı ortaya çıktı - güvenlik sertifikasıyla ilgili bir sorundu. Yanıltıcı hatalar = 4 saatlik baş ağrısı.


3
Tam olarak bu sorunu yaşadım, hata çok genel ve bunun üzerine Chrome ve Firefox farklı sertifika depoları kullanıyor, bu yüzden hata ayıklaması daha zor. Proxy'm herhangi bir OPTIONS isteğini yakalamadığında (SSL anlaşmasını bozuyordu) şüphelenmeliydim.
Daniel Correia

4
Godwhacker, belki de aynı sorunun içindeyim. Güvenlik sertifikası olduğunu nasıl anladınız? Bunu nerede görebilirsin?
Leo

9
Benim durumumda, her ikisi de dahili olarak imzalanmış sertifikalar kullanarak başka bir sunucuya çağrı yapan açısal bir uygulamam vardı. Ancak Firefox, bir kamu otoritesi tarafından tanınmadığı için sertifikaya otomatik olarak güvenmez. Bu nedenle, bu sorun ortadan kalkmadan önce her iki sunucu için de sertifikaların Firefox'ta istisna olarak eklendiğinden emin olmam gerekiyordu.
Sam Storie

3
Benim için düzeltme withCredentials=trueXHR örneğini ayarlamaktı ; aksi takdirde Firefox istekte bulunurken istemci sertifikasını kullanamadı (ancak Chrome'da sorunsuz çalıştı).
Clint Harris

1
@ SamStorie tarafından yapılan yorum, bu cevaptan çok bir cevap gibi geliyor. Teşekkürler
Naga

26

Sorunumun, çapraz isteği gönderdiğim sunucunun güvenilmeyen bir sertifikaya sahip olması olduğunu fark ettim.

İle bir çapraz etki alanına bağlanmak httpsistiyorsanız, önce bu sertifika için bir istisna eklemeniz gerekir.

Bunu, engellenen bağlantıyı bir kez ziyaret edip istisnayı ekleyerek yapabilirsiniz.


5
Bu, sitenizi ziyaret eden hiç kimseye yardımcı olmuyor, eğer mutlu değilseniz, 'Firefox kullanıyorsanız, lütfen bu siteye gidin ve istisnalar listenize ekleyin' diyen bir mesaj koyun
Godwhacker

@ Cracker0dks "Engellenen bağlantıyı bir kez ziyaret edin ve istisnayı ekleyin" istisnayı nereye ekleyeceğinizi açıklayabilir misiniz? Firefox Quantum kullanıyorum. TIA
Paul

1
bağlantıya sörf yapıyorsunuz firefox direktly hakkında şikayet ediyor. Ardından sertifika uyarısı alırsınız. Sertifikaya izin verin. Ana sitenizi tekrar ziyaret edin.
Cracker0dks

26

Firefox'taki isteklerin şu mesajla engellendiğini tespit ettiğimde bu soruyla karşılaştım:

Neden: CORS isteği başarılı olmadı

Saçımı çıkardıktan sonra, yeni yüklenen bir Firefox eklentisinin, Privacy Badger'ın istekleri engellediğini öğrendim.

Kafanızı kaşıttıktan sonra bu soruya gelirseniz, yüklediğiniz uzantılardan herhangi birinin istekleri engelleyip engellemediğini kontrol etmeyi deneyin.

Ayrıntılar için bkz. Neden: CORS isteği MDN'de başarılı olamadı .


hangi uzantının istekleri engellediğini nasıl anladınız? İstek yeni bir profile sahip (yani uzantı yok) bir Firefox'ta başarılı olduğu için aynı sorunu yaşıyorum
Ciprian Tomoiagă

1
Sorun yaşadığım belirli site için herhangi bir engelleme içeriğinden bahsedilip bahsedilmediğini görmek için her uzantıyı tıkladım. Ghostery'nin bir girişi vardı, bu yüzden siteyi güvenilir olarak işaretledim, sayfayı yeniden yükledim ve istekler başarılı oldu.
programlama profesörü

1
Teşekkür ederim! Ayrıca, tüm uzantıların izinlerine genel bir bakış sağlayan Project Insight uzantısını da keşfettim. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă

1
@awendt Oof. Benim için de Privacy Badger. Teşekkürler.
Jason Leach


12

'Gerçek' bir sertifikanız yoksa (ve dolayısıyla kendinden imzalı bir tane kullanıyorsanız), FireFox'ta şu adrese gidebilirsiniz:

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

Orada, konumu girin, örneğin: https: //wwww.myserver: myport


CORS'm Firefox dışındaki tüm diğer tarayıcılarda -> Çapraz Kaynak İsteği Engellendi: Aynı Kaynak İlkesi localhost: 44304 / v1 / search adresindeki uzak kaynağı okumaya izin vermez . (Nedeni: CORS isteği başarılı olmadı).
JGilmartin

5

Sadece bir uyarı. Sonunda Firefox ve CORS ile ilgili sorunu çözdüm.

Benim için çözüm bu yazıydı

Apache'de CORS'u (çapraz kaynak kaynak paylaşımı) doğru yanıt başlıklarıyla ayarlamak her şeyin içinden geçmesine izin veriyor | Benjamin Horn

Ancak Firefox, Apache sunucusunda (.htaccess klasöründe) bu başlıkları ayarladıktan sonra gerçekten çok garip davranıyordu.

console.log("Hi FF, you are here A")Neler olduğunu görmek için bir sürü vb. Ekledim.

İlk başta takılmış gibi görünüyordu xhr.send(). Ama sonra bu ifadeye ulaşmadığını keşfettim. console.logHemen önüne bir tane daha yerleştirdim ve oraya ulaşmadım - sonuncusu console.logile yenisi arasında hiçbir şey olmamasına rağmen . Sadece ikisi arasında durdu console.log.

Dosyada herhangi bir garip karakter olup olmadığını görmek için satırları yeniden sıralama, silme. Ben hiçbir şey bulamadım.

Firefox'u yeniden başlatmak sorunu çözdü.

Evet, bir hata bildirmeliyim. Sadece bu çok garip, bu yüzden onu nasıl yeniden üreteceğinizi bilmeyin.

DİKKAT : Ve, oh, sadece Header always setparçaları yaptım, kısmı değil Rewrite*!


Esasen bugün benim için aynı hikaye. Firefox'u yeniden başlatmak sorunu çözdü. 5 yıldan fazla bir süre sonra.
Søren Mortensen

3

Sadece ekle

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

için .htaccessweb sitesinin kök dosyası ile iletişim kurmak çalışıyoruz.


Herhangi bir yerden istekleri kabul edecek şekilde ayarlamak istiyorsanız sorun değil; eğer yapmazsan iyi değil, bu başlığın tüm noktası.
Godwhacker

2

Gelecek için, talep edilen kaynağın bir 200 döndürüp döndürmediğini görmek için sunucu günlüklerini de kontrol edin.

Uçuş öncesi ajax isteğinde tüm uygun başlıkların iade edildiği benzer bir sorunla karşılaştım, ancak tarayıcı gerçek isteğin kötü CORS başlıkları nedeniyle engellendiğini bildirdi.

Görünüşe göre, istenen sayfa hatalı kod nedeniyle, ancak yalnızca CORS aracılığıyla alındığında bir 500 hatası döndürüyordu. Tarayıcı (hem Chrome hem de Firefox) yanlışlıkla sayfanın 500 döndürdüğünü söylemek yerine Access-Control-Allow-Origin başlığının eksik olduğunu bildirdi.


1

Bunu dene, sorununu çözmeli

  1. Config.php dosyanıza domain.com adresinize www pre ekleyin. Örneğin:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Htaccess dosyanıza ekleyin

    RewriteCond %{REQUEST_METHOD} OPTIONS RewriteRule ^(.*)$ $1 [R=200,L]

1

Benim için, Access-Control-Allow-Originyanıt başlığını belirli bir (ve doğru) olarak ayarladığım ortaya çıktı, host.comancak bunun http://host.comyerine döndürülmesi gerekiyordu . Firefox ne yapar? GET isteğini sessizce yutar ve javascript konsoluna hiçbir uyarı çıktısı olmadan XHR'ye 0 durumunu döndürür, oysa diğer benzer hatalar için en azından bir şey söyler. Ai ai.


1
W3.org/TR/cors adresindeki örneklere bakarak plan bekleniyor gibi görünüyor ama yine de teşekkürler, ben de yanlış bir şey yapıyordum ve evet, Firefox hata mesajı eksik.
Richard Green

1

Hata ayıklamak için mümkünse sunucu günlüklerini kontrol edin. Firefox, çeşitli nedenlerden dolayı konsolda CORS hataları döndürür.

Sebeplerden biri de uMatrix (ve sanırım NoScript ve benzeri) eklentisi.


0

Benzer bir sorunla karşılaştım ve nasıl düzelttiğimi kaydettirmek için geçerli olduğunu düşünüyorum:

Temelde Symfony 3 üzerine inşa edilmiş bir sistemim var. Kendi kendine öğrenme ve performans amacıyla, yine genel erişimli bir API olan GoLang kullanarak birkaç komut dosyası yazmaya karar verdim.

My Go API, Json format parametreleri bekliyor ve ayrıca Json format yanıtı döndürüyor

Bunları kullandığım GoApi'leri en çok $ .ajax (jQuery) olarak adlandırmak için İlk test bir aldatmacaydı: ünlü "Cross-Origin Request Blocked" açılır penceresi! Ardından, apache conf, htaccess, php, javascript ve google'da bulabildiğim her yerde "Access-Control-Allow-Origin: *" ayarlamayı denedim!

Ancak, aynı sinir bozucu hata bile !!!

Çözüm basitti: "GET" yerine "POST" isteklerinde bulunmam gerekiyordu.

Bunu başarmak için hem GoLang hem de JavaScript'i GET'i kullanacak şekilde ayarlamam gerekiyordu! İşlem tamamlandıktan sonra, benim için artık Çapraz Kaynak İsteği Engellenmez !!!

Umarım yardımcı olur

Not:

Apache ve Vhost kullanıyorum, Sahip olduğum Dizin Bloğu üzerinde

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

Unutmayın: "*", herkesten gelen istekleri kabul edeceğiniz anlamına gelir !!! (Bu bir güvenlik eksikliği olabilir) Benim durumumda sorun değil, çünkü halka açık bir API olacak

PS2: Başlıklarım

Yanıt üstbilgileri

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

Başlık isteme (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

0

Yukarıda belirtilen cevaplar yardımcı olmazsa, benim durumumda sunucu çöktüğü gibi arka uç sunucusunun çalışıp çalışmadığını kontrol edin ve bu hata tamamen yanıltıcıdır.


0

Benim durumumda o benim ADBLOCKER'ımdı ! Bazı nedenlerden dolayı localhost'umda etkinleştirildi ve Firefox'ta bu hataya neden oldu.

Devre dışı bırakılması bunu ya kaldırmayı eklenti Bunu düzeltmek gerekir.

Sizin durumunuzda, bu bir reklam engelleyici değil, başka bir Firefox eklentisi olabilir. Sorunun bu olup olmadığını belirlemek için önce hiçbir eklenti olmadan gizli modda test edin ve ardından suçluyu bulana kadar eklentileri sistematik olarak devre dışı bırakın.


-3

Dosyalar kendinden açıklamalıdır. Bir dosya oluşturun, istediğiniz şeyi söyleyin. Benim durumumda 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>

Şimdi bir motor ekleyeceğiz, bir dosya oluşturacağız, onu istediğiniz gibi adlandıracağız. Benim durumumda bu 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);

Örneği olabildiğince basit tutmaya çalıştım. Ve her tuşa basıldığında bağlantıyı çalıştırdığı için, API'nizin kotası oldukça hızlı tüketilecektir.

Elbette, verileri bir tabloya koymak, veritabanına göndermek vb. Gibi yapabileceğimiz şeylerin sonu yok.


Lütfen aynı cevabı birden fazla göndermeyin. Ve lütfen cevabınızın soruyu gerçekten cevapladığından emin olun. Daha fazla bilgi için başka bir yere yönlendirmeniz gerekiyorsa, bu iyi bir cevap değildir.
elixenide

Merhaba Bağlantıyı kullandım çünkü ön koşullar vb. Gibi daha fazla bilgi içeriyor. Eğer uygun olduğunu hissediyorsan onu kaldıracağım.
Sert Mehta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.