Chrome weigert sich aufgrund eines falschen MIME-Typs, ein AJAX-Skript auszuführen

146

Ich versuche, über AJAX auf ein Skript als JSON zuzugreifen, das in Safari und anderen Browsern einwandfrei funktioniert, aber in Chrome leider nicht ausgeführt wird. Es kommt mit folgendem Fehler:

Die Ausführung des Skripts von '*' wurde abgelehnt, da der MIME-Typ ('application / json') nicht ausführbar ist und die strikte Überprüfung des MIME-Typs aktiviert ist.

Hier ist die Anfrage:

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

Hat jemand eine Problemumgehung dafür?

Paul Nelligan
quelle
2
Also, was ist diese Ressource? Ein JSONP-Skript oder eine JSON-Datei? Entspricht der MIME-Typ dem? Scheinbar nicht. Keine Problemumgehung erforderlich, beheben Sie sie einfach .
Bergi
Das Entfernen des Rückrufs und die Verwendung von dataType jsonp behebt das Problem nicht
Paul Nelligan
2
Ich meinte, korrigieren Sie die Serverantwort .
Bergi
5
@Bergi: Was ist, wenn der Server außerhalb der Kontrolle des OP liegt? Vielleicht versucht er, eine externe API wie LinkedIn zu verwenden .
Dan Dascalescu
2
@DanDascalescu: Er sollte dies als Fehler melden, da dies die API unbrauchbar macht. Während er darauf wartet, dass dies behoben wird, kann er einen Proxy verwenden , der den MIME-Typ oder den Inhalt ändert.
Bergi

Antworten:

70

Durch Hinzufügen eines Rückrufarguments teilen Sie jQuery mit, dass Sie eine Anforderung für JSONP mithilfe eines Skriptelements anstelle einer Anforderung für JSON mithilfe von XMLHttpRequest stellen möchten.

JSONP ist nicht JSON. Es ist ein JavaScript-Programm.

Ändern Sie Ihren Server so, dass er den richtigen MIME-Typ für JSONP ausgibt application/javascript .

(Wenn Sie schon dabei sind, hören Sie auf, jQuery mitzuteilen, dass Sie JSON erwarten, da dies widersprüchlich ist :) dataType: 'jsonp'.

QUentin
quelle
1
Ich muss Ajax zwischen zwei Sites verwenden. Führen Sie mich über die Themen, über die Sie sprechen, um "Ändern Sie Ihren Server so, dass er den richtigen MIME-Typ für JSONP ausgibt, nämlich application / javascript". Wie das geht
Taimoor Changaiz
@TaimoorChangaiz - das kann ich dir nicht sagen. Wenn Sie statische Dateien generieren, hängt dies vom verwendeten Server ab. Wenn Sie den Inhalt dynamisch generieren, hängt dies von der verwendeten Programmiersprache (und möglicherweise dem Framework) ab. Stellen Sie eine Frage, die beschreibt, was Sie bisher haben und wo Sie genau stecken.
Quentin
Danke Kumpel. Übrigens habe ich das Problem herausgefunden. Ich habe dynamische Dateien verwendet
Taimoor Changaiz
20
"Server ändern" funktioniert nicht, wenn Sie versuchen, eine externe API wie LinkedIn zu verwenden .
Dan Dascalescu
1
@ Quentin Es ist wichtig, da Fragen für andere hilfreich sein sollen, nicht nur für das OP. Google hat mich hier gezeigt und das hilft meinem Fall nicht
Juan Mendes
56

Wenn Ihr Proxyserver oder Container beim Bereitstellen der JS-Datei den folgenden Header hinzufügt, werden einige Browser wie Chrome gezwungen, die MIME-Typen streng zu überprüfen:

X-Content-Type-Options: nosniff

Entfernen Sie diesen Header, um zu verhindern, dass Chrome die MIME-Prüfung durchführt.

Tom Chamberlain
quelle
14
Es ist eine schlechte Praxis, den Content-Type-Header der in Webanwendungen bereitgestellten Ressourcen nicht bereitzustellen. Das Vermeiden von MIME-Sniffing von der Serverseite (mithilfe des X-Content-Type-Options: nosniffHeaders) ist eine gute Option, um Content-Sniffing-Angriffe zu verhindern.
Andrés Morales
Ich musste dies im Rahmen eines Sicherheitsaudits hinzufügen - jetzt weiß ich nicht, was ich tun soll !! :-(
James Poulose
11

Zu Ihrer Information, ich habe den gleichen Fehler von der Chrome-Konsole. Ich dachte, meine AJAX-Funktion würde es verursachen, aber ich habe mein minimiertes Skript von /javascripts/ajax-vanilla.min.jsbis auskommentiert /javascripts/ajax-vanilla.js. Aber in Wirklichkeit war die Quelldatei bei /javascripts/src/ajax-vanilla.js. In Chrome wird also ein fehlerhafter MIME-Typfehler angezeigt, auch wenn die Datei nicht gefunden werden kann. In diesem Fall wird die Fehlermeldung als text/plainfehlerhafter MIME-Typ beschrieben.

Lanti
quelle
1
Vielen Dank! Das war auch mein Problem. Es war im falschen Verzeichnis.
Ellisan
2
Du hast mir heute 1 Stunde gespart, Champion! Vielen Dank
Beto Aveiga
1

Ich habe diesen Fehler bei Verwendung von IIS 7.0 mit einer benutzerdefinierten 404-Fehlerseite festgestellt, obwohl ich vermute, dass dies bei jeder 404-Seite der Fall ist. Der Server gab eine HTML 404-Antwort mit einem Text / HTML-MIME-Typ zurück, der (zu Recht) nicht ausgeführt werden konnte.

James Westgate
quelle
Wir hatten ein ähnliches Problem, der zurückgegebene Inhalt war ein 302 (weil der Benutzer nicht authentifiziert wurde) und er hatte überhaupt keinen Inhaltstyp -> nicht ausführbar.
Pasi Savolainen
1

Wenn Sie ein .NET Core-Entwickler sind, sollten Sie die Inhaltstypen für Datensatz- und Google -Suchbenutzer manuell festlegen, da ihr Standardwert null oder leer ist:

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

In meinem Fall benutze ich

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

um die Anfrage (an Flickr's API) zu stellen, und ich habe den gleichen MIME-Fehler erhalten. Fügen Sie wie in der obigen Antwort den folgenden Code hinzu:

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

Das Problem wurde behoben und ich sehe den MIME-Typfehler in der Chrome-Konsole nicht mehr.

Daniel
quelle
0

Wenn die Anwendung auf IIS gehostet wird, stellen Sie sicher, dass statischer Inhalt installiert ist. Systemsteuerung> Programme> Windows-Funktionen ein- oder ausschalten> Internetinformationsdienste> World Wide Web Services> Allgemeine HTTP-Funktionen> Statischer Inhalt.

Dieses Problem trat auf, als ich versuchte, eine vorhandene Anwendung auf einer neuen IIS 10.0-Installation auszuführen

user890255
quelle