Chrome menolak untuk mengeksekusi skrip AJAX karena jenis MIME yang salah

146

Saya mencoba mengakses skrip sebagai JSON melalui AJAX, yang berfungsi dengan baik di Safari dan browser lain, tetapi sayangnya tidak akan dijalankan di Chrome. Itu datang dengan kesalahan berikut:

Menolak untuk menjalankan skrip dari '*' karena jenis MIME-nya ('aplikasi / json') tidak dapat dieksekusi, dan pengecekan tipe MIME yang ketat diaktifkan.

Ini permintaannya:

$.ajax({
    url: "http://some_url/test.json?callback=?",
    type: "GET",
    dataType: 'json',
    cache: true,
    success: function (data, status, error) {
      console.log('success', data);
    },
    error: function (data, status, error) {
      console.log('error', data, status, error);
    }
});

Apakah ada yang punya solusi untuk ini?

Paul Nelligan
sumber
2
Jadi, apa sumber daya ini? Skrip JSONP, atau file JSON? Apakah tipe MIME-nya cocok dengan itu? Sepertinya tidak. Tidak perlu penyelesaian, cukup perbaiki .
Bergi
menghapus panggilan balik dan menggunakan dataType jsonp tidak memperbaiki masalah
Paul Nelligan
2
Aku berarti, memperbaiki yang respon server .
Bergi
5
@Bergi: bagaimana jika server berada di luar kendali OP? Mungkin dia mencoba menggunakan API eksternal seperti LinkedIn .
Dan Dascalescu
2
@DanDascalescu: Dia harus melaporkan ini sebagai bug, karena itu membuat API tidak dapat digunakan. Sambil menunggu ini diperbaiki, ia dapat menggunakan proxy yang mengubah tipe atau konten mime.
Bergi

Jawaban:

70

Dengan menambahkan argumen panggilan balik, Anda memberi tahu jQuery bahwa Anda ingin membuat permintaan untuk JSONP menggunakan elemen skrip alih-alih permintaan untuk JSON menggunakan XMLHttpRequest.

JSONP bukan JSON. Ini adalah program JavaScript.

Ubah server Anda sehingga menghasilkan tipe MIME yang tepat untuk JSONP application/javascript.

(Saat Anda melakukannya, berhenti memberi tahu jQuery bahwa Anda mengharapkan JSON karena itu kontradiktif:) dataType: 'jsonp'.

Quentin
sumber
1
Saya sudah menggunakan ajax antara dua situs. Bimbing saya tentang mereka yang Anda bicarakan untuk mengatur "Ubah server Anda sehingga menghasilkan tipe MIME yang tepat untuk JSONP yang merupakan aplikasi / javascript". Bagaimana melakukan ini
Taimoor Changaiz
@TaimoorChangaiz - Saya tidak bisa memberi tahu Anda itu. Jika Anda membuat file statis, itu tergantung pada server yang Anda gunakan. Jika Anda secara dinamis menghasilkan konten, itu tergantung pada bahasa pemrograman (dan mungkin kerangka kerja) yang Anda gunakan. Coba ajukan pertanyaan yang menggambarkan apa yang Anda miliki sejauh ini dan persis di mana Anda terjebak.
Quentin
terimakasih kawan. Tapi saya menemukan masalah. Saya menggunakan file dinamis
Taimoor Changaiz
20
"Ubah server Anda" tidak berfungsi jika Anda mencoba menggunakan API eksternal seperti LinkedIn .
Dan Dascalescu
1
@ Quentin Tidak masalah karena pertanyaan seharusnya membantu orang lain, bukan hanya OP. Google menunjuk saya ke sini dan ini tidak membantu kasus saya
Juan Mendes
56

Jika server proxy atau wadah Anda menambahkan header berikut saat menyajikan file .js, itu akan memaksa beberapa browser seperti Chrome untuk melakukan pemeriksaan ketat terhadap jenis MIME:

X-Content-Type-Options: nosniff

Hapus tajuk ini untuk mencegah Chrome melakukan pemeriksaan MIME.

Tom Chamberlain
sumber
14
Merupakan praktik yang buruk untuk tidak menyediakan header jenis konten dari konten yang disajikan dalam aplikasi web. Menghindari mengendus MIME dari sisi-server (menggunakan X-Content-Type-Options: nosniffheader) adalah pilihan yang baik untuk mencegah serangan konten-sniffing.
Andrés Morales
Saya harus menambahkan ini sebagai bagian dari audit keamanan - sekarang saya tidak tahu harus berbuat apa !! :-(
James Poulose
11

FYI, saya mendapatkan kesalahan yang sama dari konsol Chrome. Saya pikir fungsi AJAX saya yang menyebabkannya, tetapi saya membatalkan komentar skrip saya yang diperkecil dari /javascripts/ajax-vanilla.min.jsmenjadi /javascripts/ajax-vanilla.js. Namun dalam kenyataannya file sumber ada di /javascripts/src/ajax-vanilla.js. Jadi di Chrome Anda mendapatkan kesalahan jenis MIME yang buruk bahkan jika file tidak dapat ditemukan. Dalam hal ini, pesan kesalahan digambarkan sebagai text/plaintipe MIME yang buruk.

Lanti
sumber
1
Terima kasih banyak! Ini juga masalah saya. Itu di direktori yang salah.
Ellisan
2
Anda menyelamatkan saya juara 1 jam hari ini! Terima kasih
Beto Aveiga
1

Saya mengalami kesalahan ini menggunakan IIS 7.0 dengan halaman kesalahan 404 kustom, meskipun saya menduga ini akan terjadi dengan halaman 404. Server mengembalikan respons html 404 dengan tipe mime teks / html yang tidak dapat (dengan benar) dijalankan.

James Westgate
sumber
Kami memiliki masalah yang sama, konten yang dikembalikan adalah 302 (karena pengguna menjadi tidak terauthentikasi) dan tidak memiliki tipe konten sama sekali -> tidak dapat dieksekusi.
Pasi Savolainen
1

Untuk catatan dan pengguna pencarian Google , Jika Anda adalah pengembang .NET Core, Anda harus mengatur tipe konten secara manual, karena nilai defaultnya adalah nol atau kosong:

var provider = new FileExtensionContentTypeProvider();
app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider
});
VahidN
sumber
0

Dalam kasus saya, saya gunakan

$.getJSON(url, function(json) { ... });

untuk membuat permintaan (ke API Flickr), dan saya mendapatkan kesalahan MIME yang sama. Seperti jawaban di atas yang disarankan, tambahkan kode berikut:

$.ajaxSetup({ dataType: "jsonp" });

Memperbaiki masalah dan saya tidak lagi melihat kesalahan tipe MIME di konsol Chrome.

Daniel
sumber
0

jika aplikasi dihosting di IIS, pastikan Konten Statis diinstal. Panel Kontrol> Program> Mengaktifkan atau menonaktifkan fitur Windows> Layanan Informasi Internet> World Wide Web Services> Fitur HTTP Umum> Konten Statis.

Saya menghadapi masalah ini ketika mencoba menjalankan aplikasi yang sudah ada pada instalasi IIS 10.0 yang baru

pengguna890255
sumber