Chrome odmawia wykonania skryptu AJAX z powodu niewłaściwego typu MIME

146

Próbuję uzyskać dostęp do skryptu jako JSON przez AJAX, który działa dobrze w Safari i innych przeglądarkach, ale niestety nie działa w Chrome. Przychodzi z następującym błędem:

Odmówił wykonania skryptu z „*”, ponieważ jego typ MIME („application / json”) nie jest wykonywalny i włączone jest ścisłe sprawdzanie typu MIME.

Oto prośba:

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

Czy ktoś ma na to obejście?

Paul Nelligan
źródło
2
Więc co to za zasób? Skrypt JSONP czy plik JSON? Czy jego typ MIME pasuje do tego? Najwyraźniej nie. Nie ma potrzeby stosowania obejścia, po prostu napraw to.
Bergi
usunięcie wywołania zwrotnego i użycie dataType jsonp nie rozwiązuje problemu
Paul Nelligan
2
Miałem na myśli, naprawić na odpowiedź serwera .
Bergi
5
@Bergi: co jeśli serwer jest poza kontrolą OP? Może próbuje skorzystać z zewnętrznego API, takiego jak LinkedIn .
Dan Dascalescu
2
@DanDascalescu: Powinien zgłosić to jako błąd, ponieważ powoduje to, że API jest bezużyteczne. Czekając na naprawienie tego problemu, może użyć proxy, które zmienia typ MIME lub zawartość.
Bergi

Odpowiedzi:

70

Dodając argument wywołania zwrotnego, mówisz jQuery, że chcesz wysłać żądanie JSONP przy użyciu elementu skryptu zamiast żądania JSON przy użyciu XMLHttpRequest.

JSONP to nie JSON. Jest to program JavaScript.

Zmień serwer, aby wyświetlał właściwy typ MIME dla JSONP, którym jest application/javascript .

(Skoro już to robisz, przestań mówić jQuery, że oczekujesz JSON, ponieważ jest to sprzeczne :) dataType: 'jsonp'.

Quentin
źródło
1
Muszę używać AJAX między dwiema witrynami. Pokaż mi, o czym mówisz, aby ustawić „Zmień serwer, aby wyświetlał właściwy typ MIME dla JSONP, czyli application / javascript”. Jak to zrobić
Taimoor Changaiz
@TaimoorChangaiz - tego nie mogę ci powiedzieć. Jeśli generujesz pliki statyczne, zależy to od używanego serwera. Jeśli dynamicznie generujesz zawartość, zależy to od używanego języka programowania (i prawdopodobnie frameworka). Spróbuj zadać pytanie, które opisuje, co masz do tej pory i dokładnie, na czym utknąłeś.
Quentin
Dzięki stary. Przy okazji odkryłem problem.
Używałem
20
Opcja „Zmień serwer” nie działa, jeśli próbujesz użyć zewnętrznego interfejsu API, takiego jak LinkedIn .
Dan Dascalescu
1
@Quentin Ma to znaczenie, ponieważ pytania mają być pomocne dla innych, a nie tylko dla PO. Google wskazało mnie tutaj i to nie pomaga w mojej sprawie
Juan Mendes
56

Jeśli Twój serwer proxy lub kontener doda następujący nagłówek podczas udostępniania pliku .js, zmusi to niektóre przeglądarki, takie jak Chrome, do ścisłego sprawdzania typów MIME:

X-Content-Type-Options: nosniff

Usuń ten nagłówek, aby uniemożliwić Chrome wykonywanie sprawdzania MIME.

Tom Chamberlain
źródło
14
Niedostarczanie nagłówka Content-Type zasobów obsługiwanych w aplikacjach internetowych jest złą praktyką. Unikanie podsłuchiwania MIME po stronie serwera (przy użyciu X-Content-Type-Options: nosniffnagłówka) jest dobrą opcją, aby zapobiec atakom polegającym na wykrywaniu treści.
Andrés Morales
Musiałem to dodać w ramach audytu bezpieczeństwa - teraz nie wiem, co robić !! :-(
James Poulose
11

FYI, mam ten sam błąd z konsoli Chrome. Myślałem, że powoduje to moja funkcja AJAX, ale odkomentowałem mój zminimalizowany skrypt od /javascripts/ajax-vanilla.min.jsdo /javascripts/ajax-vanilla.js. Ale w rzeczywistości plik źródłowy był pod adresem /javascripts/src/ajax-vanilla.js. Więc w Chrome pojawia się zły błąd typu MIME, nawet jeśli nie można znaleźć pliku. W takim przypadku komunikat o błędzie jest opisywany jako text/plainzły typ MIME.

Lanti
źródło
1
Dziękuję bardzo! To też był mój problem. To było w złym katalogu.
Ellisan
2
Uratowałeś mi dzisiaj 1 godzinę mistrzu! Dzięki
Beto Aveiga
1

Napotkałem ten błąd przy użyciu usług IIS 7.0 z niestandardową stroną błędu 404, chociaż podejrzewam, że stanie się to z każdą stroną 404. Serwer zwrócił odpowiedź html 404 z typem MIME text / html, której (słusznie) nie można było wykonać.

James Westgate
źródło
Mieliśmy podobny problem, zwrócona treść była 302 (ponieważ użytkownik stał się nieuwierzytelniony) i nie miała żadnego typu treści -> nie wykonywalna.
Pasi Savolainen
1

Dla rekordu i użytkowników wyszukiwarki Google , jeśli jesteś programistą .NET Core, powinieneś ustawić typy zawartości ręcznie, ponieważ ich domyślna wartość to null lub pusta:

var provider = new FileExtensionContentTypeProvider();
app.UseStaticFiles(new StaticFileOptions
{
    ContentTypeProvider = provider
});
VahidN
źródło
0

W moim przypadku używam

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

aby wysłać żądanie (do API Flickr) i otrzymałem ten sam błąd MIME. Jak sugerowała powyższa odpowiedź, dodając następujący kod:

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

Naprawiliśmy problem i nie widzę już błędu typu MIME w konsoli Chrome.

Daniel
źródło
0

jeśli aplikacja jest hostowana w usługach IIS, upewnij się, że jest zainstalowana zawartość statyczna. Panel sterowania> Programy> Włącz lub wyłącz funkcje systemu Windows> Internetowe usługi informacyjne> Usługi World Wide Web> Typowe funkcje HTTP> Zawartość statyczna.

Napotkałem ten problem podczas próby uruchomienia istniejącej aplikacji na nowej instalacji IIS 10.0

user890255
źródło