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

112

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

Отказался от выполнения script из '*', потому что его тип 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 этому? Очевидно нет. Нет необходимости в обходном пути, просто исправьте это.
  • 0
    удаление обратного вызова и использование dataType jsonp не решает проблему
Показать ещё 3 комментария
Теги:
google-chrome

5 ответов

59
Лучший ответ

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

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

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

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

  • 1
    Я должен использовать AJAX между двумя сайтами. Направьте мне их, о которых вы говорите, чтобы установить «Измените свой сервер, чтобы он выводил правильный тип MIME для JSONP, который является application / javascript». Как это сделать
  • 0
    @TaimoorChangaiz - я не могу вам этого сказать. Если вы генерируете статические файлы, это зависит от сервера, который вы используете. Если вы динамически генерируете контент, это зависит от языка программирования (и, возможно, фреймворка), который вы используете. Попробуйте задать вопрос, который описывает, что у вас есть и где именно вы застряли.
Показать ещё 10 комментариев
38

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

X-Content-Type-Options: nosniff

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

  • 13
    Не рекомендуется предоставлять заголовок Content-Type для ресурсов, обслуживаемых в веб-приложениях. Предотвращение перехвата MIME со стороны сервера (с использованием заголовка X-Content-Type-Options: nosniff ) является хорошим вариантом для предотвращения атак с X-Content-Type-Options: nosniff контента.
  • 1
    идеальное объяснение +1 :) !!!
Показать ещё 1 комментарий
4

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

  • 1
    Спасибо большое! Это была моя проблема. Это было в неправильном каталоге.
  • 2
    Вы спасли меня 1 час сегодня чемпион! Спасибо
1

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

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

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню