Chrome refuse d'exécuter un script AJAX en raison d'un type MIME incorrect

146

J'essaie d'accéder à un script au format JSON via AJAX, qui fonctionne bien sur Safari et d'autres navigateurs mais ne s'exécutera malheureusement pas dans Chrome. Cela vient avec l'erreur suivante:

Refus d'exécuter le script à partir de '*' car son type MIME ('application / json') n'est pas exécutable et la vérification stricte du type MIME est activée.

Voici la demande:

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

Quelqu'un at-il une solution de contournement pour cela?

Paul Nelligan
la source
2
Alors, quelle est cette ressource? Un script JSONP ou un fichier JSON? Son type MIME correspond-il à cela? Apparemment non. Pas besoin de solution de contournement, il suffit de le réparer .
Bergi
la suppression du rappel et l'utilisation de dataType jsonp ne résout pas le problème
Paul Nelligan
2
Je voulais dire, réparer la réponse du serveur .
Bergi
5
@Bergi: et si le serveur est hors du contrôle de l'OP? Peut-être qu'il essaie d'utiliser une API externe telle que LinkedIn .
Dan Dascalescu
2
@DanDascalescu: Il devrait signaler cela comme un bogue, car cela rend l'API inutilisable. En attendant que cela soit corrigé, il peut utiliser un proxy qui change le type ou le contenu de mime.
Bergi

Réponses:

70

En ajoutant un argument de rappel, vous indiquez à jQuery que vous souhaitez faire une demande pour JSONP à l'aide d'un élément de script au lieu d'une demande pour JSON à l'aide de XMLHttpRequest.

JSONP n'est pas JSON. C'est un programme JavaScript.

Modifiez votre serveur afin qu'il génère le bon type MIME pour JSONP, à savoir application/javascript.

(Pendant que vous y êtes, arrêtez de dire à jQuery que vous attendez du JSON car c'est contradictoire :) dataType: 'jsonp'.

Quentin
la source
1
Je dois utiliser ajax entre deux sites. Guidez-moi à propos de ceux dont vous parlez pour définir "Changez votre serveur afin qu'il affiche le bon type MIME pour JSONP qui est application / javascript". Comment faire thi
Taimoor Changaiz
@TaimoorChangaiz - Je ne peux pas vous le dire. Si vous générez des fichiers statiques, cela dépend du serveur que vous utilisez. Si vous générez dynamiquement le contenu, cela dépend du langage de programmation (et éventuellement du framework) que vous utilisez. Essayez de poser une question qui décrit ce que vous avez jusqu'à présent et où vous vous trouvez exactement.
Quentin
Merci mon pote. Btw j'ai compris le problème. J'utilisais des fichiers dynamiques
Taimoor Changaiz
20
"Changer de serveur" ne fonctionne pas si vous essayez d'utiliser une API externe telle que LinkedIn .
Dan Dascalescu
1
@Quentin C'est important puisque les questions sont censées être utiles aux autres, pas seulement au PO. Google m'a indiqué ici et cela n'aide pas mon cas
Juan Mendes
56

Si votre serveur proxy ou conteneur ajoute l'en-tête suivant lors de la diffusion du fichier .js, cela forcera certains navigateurs tels que Chrome à effectuer une vérification stricte des types MIME:

X-Content-Type-Options: nosniff

Supprimez cet en-tête pour empêcher Chrome d'effectuer la vérification MIME.

Tom Chamberlain
la source
14
Il est déconseillé de fournir l'en-tête Content-Type des ressources servies dans les applications Web. Éviter le reniflement MIME du côté serveur (en utilisant l'en- X-Content-Type-Options: nosnifftête) est une bonne option pour empêcher les attaques de reniflage de contenu.
Andrés Morales
J'ai dû l'ajouter dans le cadre d'un audit de sécurité - maintenant je ne sais pas quoi faire !! :-(
James Poulose
11

FYI, j'ai la même erreur de la console Chrome. Je pensais que ma fonction AJAX en était la cause, mais j'ai décommenté mon script minifié de /javascripts/ajax-vanilla.min.jsà /javascripts/ajax-vanilla.js. Mais en réalité, le fichier source était à /javascripts/src/ajax-vanilla.js. Donc, dans Chrome, vous obtenez une mauvaise erreur de type MIME même si le fichier est introuvable. Dans ce cas, le message d'erreur est décrit comme text/plainun type MIME incorrect.

Lanti
la source
1
Merci beaucoup! C'était aussi mon problème. C'était dans le mauvais répertoire.
Ellisan du
2
Tu m'as sauvé 1 heure de champion aujourd'hui! Merci
Beto Aveiga
1

J'ai rencontré cette erreur en utilisant IIS 7.0 avec une page d'erreur 404 personnalisée, bien que je soupçonne que cela se produira avec n'importe quelle page 404. Le serveur a renvoyé une réponse html 404 avec un type mime text / html qui n'a pas pu (à juste titre) être exécuté.

James Westgate
la source
Nous avons eu un problème similaire, le contenu retourné était un 302 (parce que l'utilisateur n'est plus authentifié) et il n'avait pas du tout de type de contenu -> non exécutable.
Pasi Savolainen
1

Pour les utilisateurs d'enregistrement et de recherche Google , si vous êtes un développeur .NET Core, vous devez définir les types de contenu manuellement, car leur valeur par défaut est nulle ou vide:

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

Dans mon cas, j'utilise

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

pour faire la demande (à l'API de Flickr), et j'ai eu la même erreur MIME. Comme la réponse ci-dessus suggérée, en ajoutant le code suivant:

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

Correction du problème et je ne vois plus l'erreur de type MIME dans la console de Chrome.

Daniel
la source
0

si l'application est hébergée sur IIS, assurez-vous que le contenu statique est installé. Panneau de configuration> Programmes> Activer ou désactiver les fonctionnalités Windows> Internet Information Services> Services World Wide Web> Fonctionnalités HTTP communes> Contenu statique.

J'ai rencontré ce problème en essayant d'exécuter une application existante sur une nouvelle installation IIS 10.0

user890255
la source