Chrome отказывается выполнять сценарий AJAX из-за неправильного типа MIME


146

Я пытаюсь получить доступ к сценарию как JSON через AJAX, который прекрасно работает в Safari и других браузерах, но, к сожалению, не будет выполняться в Chrome. Это происходит со следующей ошибкой:

Отказался от выполнения скрипта из '*', потому что его тип MIME ('application / json') не является исполняемым, и включена строгая проверка типов MIME.

Вот запрос:

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

У кого-нибудь есть обходной путь для этого?


2
Итак, что это за ресурс? Сценарий JSONP или файл JSON? Соответствует ли его тип MIME этому? Очевидно нет. Нет необходимости в обходном пути, просто исправьте это.
Берги

удаление обратного вызова и использование dataType jsonp не решает проблему
Пол Неллиган,

2
Я имел в виду, исправить в ответ сервера .
Берги

5
@Bergi: что если сервер находится вне контроля ОП? Может быть, он пытается использовать внешний API, такой как LinkedIn .
Дан Дакалеску

2
@DanDascalescu: Он должен сообщить об этом как об ошибке, потому что это делает API непригодным для использования. В ожидании исправления он может использовать прокси, который меняет тип MIME или контент.
Берги

Ответы:


70

Добавляя аргумент обратного вызова, вы сообщаете jQuery, что хотите сделать запрос для JSONP, используя элемент script вместо запроса для JSON, используя XMLHttpRequest.

JSONP - это не JSON. Это программа на JavaScript.

Измените ваш сервер так, чтобы он выводил правильный тип MIME для JSONP, который есть application/javascript.

(Пока вы это делаете, прекратите говорить jQuery, что вы ожидаете JSON, поскольку это противоречиво:) dataType: 'jsonp'.


1
Я должен использовать AJAX между двумя сайтами. Направьте мне их, о которых вы говорите, чтобы установить «Измените свой сервер так, чтобы он выводил правильный тип MIME для JSONP, который является application / javascript». Как это сделать
Таймур Чангайз

@TaimoorChangaiz - я не могу вам этого сказать. Если вы генерируете статические файлы, это зависит от сервера, который вы используете. Если вы динамически генерируете контент, это зависит от языка программирования (и, возможно, фреймворка), который вы используете. Попробуйте задать вопрос, который описывает, что у вас есть и где именно вы застряли.
Квентин

Спасибо дружище. Кстати я разобрался с вопросом. Я использовал динамические файлы
Taimoor Changaiz

20
«Изменить свой сервер» не работает, если вы пытаетесь использовать внешний API, такой как LinkedIn .
Дан Даскалеску

1
@Quentin Это имеет значение, поскольку вопросы должны быть полезны для других, а не только для ОП. Google указал мне здесь, и это не помогает моему делу
Хуан Мендес

56

Если ваш прокси-сервер или контейнер добавляет следующий заголовок при обслуживании файла .js, это заставит некоторые браузеры, такие как Chrome, выполнять строгую проверку типов MIME:

X-Content-Type-Options: nosniff

Удалите этот заголовок, чтобы Chrome не выполнял проверку MIME.


14
Это плохая практика - не предоставлять заголовок Content-Type ресурсов, обслуживаемых в веб-приложениях. Избегание перехвата MIME со стороны сервера (используя X-Content-Type-Options: nosniffзаголовок) - хороший вариант для предотвращения атак с перехватом контента.
Андрес Моралес

Я должен был добавить это как часть аудита безопасности - теперь я не знаю, что делать !! :-(
Джеймс Полус

11

К вашему сведению, у меня такая же ошибка с консоли Chrome. Я думал, что это вызвано моей функцией AJAX, но я раскомментировал свой уменьшенный скрипт от /javascripts/ajax-vanilla.min.jsдо /javascripts/ajax-vanilla.js. Но на самом деле исходный файл был на /javascripts/src/ajax-vanilla.js. Таким образом, в Chrome вы получаете ошибку MIME-типа, даже если файл не найден. В этом случае сообщение об ошибке описывается как text/plainневерный MIME-тип.


1
Большое тебе спасибо! Это была моя проблема. Это было в неправильном каталоге.
Эллисан

2
Вы спасли меня 1 час сегодня чемпион! Спасибо
Бето Авейга

1

Я столкнулся с этой ошибкой, используя IIS 7.0 с пользовательской страницей ошибки 404, хотя я подозреваю, что это произойдет с любой страницей 404. Сервер возвратил ответ html 404 с типом mime text / html, который не мог (правильно) быть выполнен.


У нас была похожая проблема, возвращаемый контент был 302 (потому что пользователь стал неаутентифицированным), и у него вообще не было типа контента -> неисполняемый.
Паси Саволайнен

1

Для пользователей записей и поиска в Google : если вы являетесь разработчиком .NET Core, вам следует установить типы контента вручную, поскольку их значение по умолчанию равно нулю или пусто:

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

0

В моем случае я использую

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

сделать запрос (к API Flickr), и я получил ту же ошибку MIME. Как и предложенный выше ответ, добавьте следующий код:

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

Исправлена ​​проблема, и я больше не вижу ошибку типа MIME в консоли Chrome.


0

если приложение размещено в IIS, убедитесь, что установлено статическое содержимое. Панель управления> Программы> Включить или выключить функции Windows> Службы IIS> Службы World Wide Web> Общие функции HTTP> Статическое содержимое.

Я столкнулся с этой проблемой при попытке запустить существующее приложение на новой установке IIS 10.0

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.