2014-07-02 7 views
119

Sto provando ad accedere a uno script come JSON tramite AJAX, che funziona bene su Safari e altri browser, ma purtroppo non verrà eseguito in Chrome. E 'venuta con il seguente errore:Chrome si rifiuta di eseguire uno script AJAX a causa di un tipo MIME errato

Refused to execute script from '*' because its MIME type ('application/json') is not executable, and strict MIME type checking is enabled.

Ecco la richiesta:

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

Qualcuno ha una soluzione per questo?

+2

Quindi, qual è questa risorsa? Uno script JSONP o un file JSON? Il suo tipo MIME corrisponde a quello? Apparentemente no. Non c'è bisogno di una soluzione alternativa, basta * risolvere * esso. – Bergi

+0

rimozione della richiamata e utilizzo di dataType jsonp non risolve il problema –

+1

Intendevo, * correggere * la * risposta del server *. – Bergi

risposta

61

Aggiungendo un argomento di callback, stai dicendo a jQuery che vuoi fare una richiesta per JSONP usando un elemento script invece di una richiesta per JSON usando XMLHttpRequest.

JSONP non è JSON. È un programma JavaScript.

Cambiare il server in modo che emetta il tipo MIME corretto per JSONP che è application/javascript.

(Mentre ci sei, smetti di dire a jQuery che ti aspetti JSON in quanto contraddittorio: dataType: 'jsonp').

+1

Devo usare ajax tra due siti. Guidami riguardo a ciò di cui stai parlando per impostare "Cambia il tuo server in modo che generi il giusto tipo MIME per JSONP che è application/javascript". Come fare thi –

+0

@TaimoorChangaiz - Non posso dirtelo. Se stai generando file statici, dipende dal server che stai utilizzando. Se si sta generando dinamicamente il contenuto, dipende dal linguaggio di programmazione (e possibilmente dal framework) che si sta utilizzando. Prova [chiedendo una domanda] (http://stackoverflow.com/questions/ask) che descrive ciò che hai finora e esattamente dove sei bloccato. – Quentin

+0

grazie amico. A parte ho capito il problema. Stavo usando i file dinamici –

0

Nel mio caso, io uso

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

per effettuare la richiesta (API di Flickr), ed ho ottenuto lo stesso errore MIME. Come la risposta di cui sopra suggerito, aggiungendo il seguente codice:

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

Risolto il problema e non vedo più l'errore di tipo MIME nella console di Chrome.

43

Se il server proxy o un contenitore aggiunge la seguente intestazione quando serve il file .js, che costringerà alcuni browser come Chrome per eseguire il controllo rigoroso dei tipi MIME:

X-Content-Type-Options: nosniff 

Rimuovi questa intestazione per evitare Chrome eseguendo il controllo MIME.

+11

È una cattiva pratica non fornire l'intestazione Content-Type delle risorse pubblicate nelle applicazioni Web. Evitare lo sniffing MIME dal lato server (usando l'opzione 'X-Content-Type-Options: nosniff') è una buona opzione per prevenire gli attacchi di sniffing dei contenuti. –

+1

spiegazione perfetta +1 :) !!! – SagarPPanchal

4

FYI, ho lo stesso errore dalla console di Chrome. Ho pensato che la mia funzione AJAX lo causasse, ma ho decommentato il mio script minified da /javascripts/ajax-vanilla.min.js a /javascripts/ajax-vanilla.js. Ma in realtà il file sorgente era a /javascripts/src/ajax-vanilla.js. Pertanto, in Chrome si verifica un errore di tipo MIME errato anche se non è possibile trovare il file. In questo caso, il messaggio di errore è descritto come text/plain di tipo MIME non valido.

+0

Grazie mille! Anche questo era il mio problema. Era nella directory sbagliata. – Ellisan

1

Ho riscontrato questo errore utilizzando IIS 7.0 con una pagina di errore 404 personalizzata, sebbene sospetto che ciò accada con qualsiasi pagina 404. Il server ha restituito una risposta html 404 con un tipo mime text/html che non poteva (giustamente) essere eseguito.

+0

Abbiamo avuto un problema simile, il contenuto restituito era un 302 (perché l'utente non era autenticato) e non aveva affatto un tipo di contenuto -> non eseguibile. –

Problemi correlati