Firefox 'Permintaan Lintas Asal Diblokir' meskipun ada header

119

Saya mencoba membuat permintaan lintas sumber sederhana, dan Firefox secara konsisten memblokirnya dengan kesalahan ini:

Permintaan Lintas-Asal Diblokir: Kebijakan Asal yang Sama melarang membaca sumber daya jarak jauh di [url]. Ini dapat diperbaiki dengan memindahkan sumber daya ke domain yang sama atau mengaktifkan CORS. [url]

Ini berfungsi dengan baik di Chrome dan Safari.

Sejauh yang saya tahu, saya telah mengatur semua tajuk yang benar di PHP saya untuk memungkinkan ini berfungsi. Inilah yang server saya tanggapi

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

Saya sudah mencoba menggunakan Angular, jQuery, dan objek XMLHTTPRequest dasar, seperti:

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

... dan berfungsi di setiap browser kecuali Firefox. Adakah yang bisa membantu dengan ini?

Godwhacker
sumber
Bisakah Anda memberikan jejak lengkap semua permintaan dan tanggapan? Atau setidaknya sediakan situs uji? Jika situs web mengakses http, https, file asal jauh? mozSystemtidak didukung untuk situs web biasa hanya memaketkan aplikasi firefox-os , jadi jatuhkan opsi itu.
nmaier
1
@nmaier Header saat mengirim sebagai POST daripada 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 Kesalahan: 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 Sebenarnya tampaknya ini adalah masalah dengan sertifikat keamanan di situs yang saya akses- Firefox hanya memberikan kesalahan palsu. Jika saya menambahkan situs ke daftar pengecualian, itu berfungsi dengan baik.
Godwhacker

Jawaban:

121

Ternyata ini tidak ada hubungannya dengan CORS- ini adalah masalah dengan sertifikat keamanan. Kesalahan menyesatkan = 4 jam sakit kepala.

Godwhacker
sumber
3
Baru saja mengalami masalah ini, kesalahannya terlalu umum dan di atas itu Chrome dan Firefox menggunakan penyimpanan sertifikat yang berbeda, jadi lebih sulit untuk melakukan debug. Saya seharusnya menduga bahwa ketika proxy saya tidak menangkap permintaan OPTIONS apa pun (itu melanggar handshake SSL).
Daniel Correia
4
Godwhacker, saya mengalami masalah yang sama, mungkin. Bagaimana Anda mengetahui bahwa itu adalah sertifikat keamanan? Di mana Anda bisa melihat ini?
Leo
9
Dalam kasus saya, saya memiliki aplikasi sudut yang membuat panggilan ke server lain, dengan keduanya menggunakan sertifikat yang ditandatangani secara internal. Namun, Firefox tidak secara otomatis mempercayai sertifikat tersebut karena tidak diakui oleh otoritas publik. Jadi saya perlu memastikan sertifikat untuk kedua server ditambahkan sebagai pengecualian di Firefox sebelum masalah ini hilang.
Sam Storie
3
Bagi saya, perbaikannya adalah mengatur withCredentials=truepada instance XHR; jika tidak, Firefox gagal menggunakan sertifikat klien saat membuat permintaan (namun, berfungsi dengan baik di Chrome).
Clint Harris
1
Komentar oleh @SamStorie terdengar lebih seperti jawaban daripada jawaban ini. Terima kasih
Naga
26

Saya menemukan bahwa masalah saya adalah server yang saya kirimkan permintaan silang memiliki sertifikat yang tidak dipercaya.

Jika Anda ingin terhubung ke lintas domain dengan https, Anda harus menambahkan pengecualian untuk sertifikat ini terlebih dahulu.

Anda dapat melakukan ini dengan mengunjungi tautan yang diblokir satu kali dan menambahkan pengecualian.

Cracker0dks
sumber
5
Itu tidak secara khusus membantu siapa pun yang mengunjungi situs Anda, kecuali Anda senang meletakkan pesan di sana yang mengatakan 'Jika Anda menggunakan Firefox, silakan kunjungi situs ini dan tambahkan ke daftar pengecualian Anda'
Godwhacker
@ Cracker0dks "mengunjungi tautan yang diblokir satu kali dan menambahkan pengecualian" dapatkah Anda menjelaskan lebih lanjut ke mana harus menambahkan pengecualian? Saya menggunakan Firefox Quantum. TIA
Paul
1
Anda membuka tautan firefox mengeluh tentang direktly. Kemudian Anda mendapatkan peringatan sertifikat. Izinkan sertifikat. Kunjungi situs utama Anda lagi.
Cracker0dks
26

Saya menemukan pertanyaan ini setelah menemukan permintaan di Firefox yang diblokir dengan pesan:

Alasan: Permintaan CORS tidak berhasil

Setelah menarik rambut saya, saya menemukan bahwa ekstensi Firefox yang baru dipasang, Privacy Badger, memblokir permintaan tersebut.

Jika Anda sampai pada pertanyaan ini setelah menggaruk-garuk kepala, coba periksa untuk melihat ekstensi apa yang telah Anda pasang untuk melihat apakah ada di antara mereka yang memblokir permintaan.

Lihat Alasan: Permintaan CORS tidak berhasil di MDN untuk detailnya.

Profesor pemrograman
sumber
bagaimana Anda mengetahui ekstensi mana yang memblokir permintaan? Saya mengalami masalah yang sama, karena permintaan berhasil di Firefox dengan profil baru (jadi tidak ada ekstensi)
Ciprian Tomoiagă
1
Saya mengeklik setiap ekstensi untuk melihat apakah ada yang menyebutkan pemblokiran konten untuk situs tertentu yang bermasalah dengan saya. Ghostery memiliki entri jadi saya menandai situs tersebut sebagai tepercaya, memuat ulang halaman, dan permintaan berhasil.
Profesor pemrograman
1
Terima kasih! Saya juga menemukan ekstensi Project Insight yang memberikan gambaran umum tentang semua izin ekstensi. addons.mozilla.org/en-US/firefox/addon/project-insight
Ciprian Tomoiagă
1
@endt. Privacy Badger untuk saya juga. Terima kasih.
Jason Leach
12

Jika Anda tidak memiliki sertifikat 'asli' (dan karenanya menggunakan sertifikat yang ditandatangani sendiri), di FireFox Anda dapat pergi ke:

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

Disana isikan lokasinya, misal: https: //wwww.myserver: myport

Hypenate
sumber
ini berfungsi untuk saya ketika CORS saya berfungsi di semua browser lain kecuali Firefox dengan kesalahan -> Permintaan Lintas-Asal Diblokir: Kebijakan Asal yang Sama melarang membaca sumber daya jarak jauh di localhost: 44304 / v1 / search . (Alasan: permintaan CORS tidak berhasil).
JGilmartin
5

Hanya satu kata peringatan. Saya akhirnya mengatasi masalah dengan Firefox dan CORS.

Solusi bagi saya adalah posting ini

Menyetel CORS (berbagi sumber daya lintas sumber) di Apache dengan header respons yang benar memungkinkan semuanya melalui | Benjamin Horn

Namun Firefox berperilaku sangat, sangat aneh setelah mengatur header tersebut di server Apache (di folder .htaccess).

Saya menambahkan banyak console.log("Hi FF, you are here A")dll untuk melihat apa yang sedang terjadi.

Pada awalnya sepertinya itu digantung xhr.send(). Tapi kemudian saya menemukan itu tidak sampai pada pernyataan ini. Saya menempatkan yang lain console.logtepat sebelum itu dan tidak sampai di sana - meskipun tidak ada apa-apa antara yang terakhir console.logdan yang baru. Itu hanya berhenti di antara dua console.log.

Menyusun ulang baris, menghapus, untuk melihat apakah ada karakter aneh dalam file. Saya tidak menemukan apa pun.

Memulai ulang Firefox memperbaiki masalah.

Ya, saya harus melaporkan bug. Hanya saja sangat aneh sehingga tidak tahu bagaimana cara memperbanyaknya.

PEMBERITAHUAN : Dan, oh, saya baru saja mengerjakan Header always setbagiannya, bukan Rewrite*bagiannya!

Leo
sumber
Cerita yang sama untuk saya hari ini, pada dasarnya. Memulai ulang Firefox memperbaikinya. Lebih dari 5 tahun kemudian.
Søren Mortensen
3

Tambahkan saja

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

ke .htaccessfile di root situs web yang Anda coba sambungkan.

Gareth
sumber
Tidak apa-apa jika Anda ingin menyetelnya untuk menerima permintaan dari mana saja; tidak baik jika Anda tidak melakukannya, yang merupakan inti dari header.
Godwhacker
2

Untuk anak cucu, periksa juga log server untuk melihat apakah sumber daya yang diminta mengembalikan 200.

Saya mengalami masalah serupa, di mana semua header yang tepat dikembalikan dalam permintaan ajax pra-penerbangan, tetapi browser melaporkan bahwa permintaan sebenarnya diblokir karena header CORS yang buruk.

Ternyata, halaman yang diminta mengembalikan kesalahan 500 karena kode yang buruk, tetapi hanya jika diambil melalui CORS. Browser (baik Chrome dan Firefox) secara keliru melaporkan bahwa header Access-Control-Allow-Origin hilang alih-alih mengatakan bahwa halaman tersebut mengembalikan 500.

Jack Stouffer
sumber
1

Coba ini, ini akan menyelesaikan masalah Anda

  1. Di config.php Anda, tambahkan www pre di domain.com Anda. Sebagai contoh:

    HTTP define('HTTP_SERVER', 'http://domain name with www/');
    HTTPS define('HTTPS_SERVER', 'http://domain name with www/');
  2. Tambahkan ini ke file .htaccess Anda

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

Bagi saya, ternyata Access-Control-Allow-Originheader respon saya setting ke spesifik (dan benar) host.comtetapi harus dikembalikan sebagai http://host.comgantinya. Apa yang dilakukan firefox? Ini diam-diam menelan permintaan GET dan mengembalikan status 0 ke XHR, tanpa output peringatan ke konsol javascript, sedangkan untuk kegagalan serupa lainnya setidaknya akan mengatakan sesuatu. Ai ai.

rogerdpack
sumber
1
Sepertinya skema ini diharapkan, melihat contoh di w3.org/TR/cors tapi bagaimanapun terima kasih, saya melakukan hal yang salah juga, dan ya, pesan kesalahan Firefox kurang.
Richard Green
1

Untuk men-debug, periksa log server jika memungkinkan. Firefox mengembalikan kesalahan CORS di konsol karena berbagai alasan.

Salah satu alasannya adalah juga uMatrix (dan saya rasa NoScript dan sejenisnya juga) plugin.

johndodo
sumber
0

Saya menghadapi masalah serupa, dan saya pikir valid untuk didaftarkan bagaimana saya memperbaikinya:

Saya memiliki sistem yang pada dasarnya dibangun di atas Symfony 3. Untuk belajar sendiri dan tujuan kinerja, saya memutuskan untuk menulis beberapa skrip menggunakan GoLang, juga, API dengan akses publik.

My Go API mengharapkan parameter format Json, dan juga mengembalikan respons format Json

Untuk memanggil GoApi yang saya gunakan, kebanyakan, $ .ajax (jQuery) Tes pertama adalah penipuan: pop up "Permintaan Lintas-Asal Diblokir" (tidak) terkenal! Kemudian, saya mencoba untuk mengatur "Access-Control-Allow-Origin: *" pada confache conf, htaccess, php, javascript dan di mana saja saya dapat menemukan di google!

Tapi, bahkan, kesalahan membuat frustrasi yang sama !!!

Solusinya sederhana: Saya harus membuat permintaan "POST", bukan "GET".

Untuk mencapai itu saya harus menyesuaikan keduanya, GoLang dan JavaScript untuk menggunakan GET! Setelah selesai, tidak ada lagi Permintaan Lintas Asal yang Diblokir untukku !!!

Semoga Membantu

PS:

Saya menggunakan apache dan Vhost, di Blok Direktori yang saya miliki

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

Ingat: "*" berarti Anda akan menerima permintaan dari siapa pun !!! (Yang mungkin merupakan kekurangan keamanan) Dalam kasus saya, tidak apa-apa, karena ini akan menjadi API publik

PS2: Header Saya

Header respons

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

Header permintaan (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
sumber
0

Jika jawaban yang disebutkan di atas tidak membantu, periksa apakah server backend aktif dan berjalan atau tidak seperti dalam kasus saya server macet dan kesalahan ini ternyata benar-benar menyesatkan.

Neeraj Sewani
sumber
0

Dalam kasus saya itu adalah ADBLOCKER saya ! Untuk beberapa alasan itu diaktifkan di localhost saya dan menyebabkan kesalahan ini di Firefox.

Menonaktifkan atau menghapus yang plugin yang harus memperbaiki ini.

Dalam kasus Anda, ini mungkin bukan adblocker tetapi plugin Firefox lainnya. Uji coba dalam mode penyamaran terlebih dahulu tanpa plugin untuk menentukan apakah itu masalahnya dan kemudian nonaktifkan plugin secara sistematis hingga Anda menemukan pelakunya.

Christian Heath
sumber
-3

File-file itu cukup jelas. Buat file, sebut saja apa saja. Dalam kasus saya 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>

Sekarang kami akan menyertakan mesin, membuat file, menyebutnya apa pun yang Anda suka. Dalam kasus saya ini adalah 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);

Saya telah mencoba membuat contoh sesederhana mungkin. Dan karena itu mengeksekusi tautan pada setiap penekanan tombol, kuota API Anda akan dikonsumsi dengan cukup cepat.

Tentu tidak ada habisnya hal-hal yang bisa kita lakukan, seperti memasukkan data ke dalam tabel, mengirim ke database dan sebagainya.

Mehta yang keras
sumber
Harap jangan memposting jawaban yang sama lebih dari sekali. Dan harap pastikan jawaban Anda benar-benar menjawab pertanyaan tersebut. Jika Anda perlu mengarahkan seseorang ke tempat lain untuk mendapatkan lebih banyak informasi, itu bukan jawaban yang baik.
elixenide
Halo Saya menggunakan tautannya karena memiliki beberapa informasi lebih lanjut seperti prasyarat dll. Jika Anda merasa itu sesuai, saya akan menghapusnya.
Harsh Mehta