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?


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'.


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.


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.


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.


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
});

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.


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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.