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, використовуючи елемент сценарію замість запиту для JSON за допомогою XMLHttpRequest.

JSONP - це не JSON. Це програма JavaScript.

Змініть ваш сервер, щоб він виводив правильний тип MIME для JSONP, який є application/javascript.

(Поки ви перебуваєте на цьому, перестаньте говорити jQuery, що ви очікуєте JSON, як це суперечливо:) dataType: 'jsonp'.


1
Я повинен використовувати ajax між двома сайтами. Поведіть мене про те, про що ви говорите, щоб встановити "Змінити ваш сервер, щоб він виводив правильний тип MIME для JSONP, який є програмою / javascript". Як зробити це
Таймур Чангаїз

@TaimoorChangaiz - я не можу тобі цього сказати. Якщо ви створюєте статичні файли, це залежить від сервера, який ви використовуєте. Якщо ви динамічно генеруєте вміст, це залежить від мови програмування (і, можливо, фреймворку), який ви використовуєте. Спробуйте задати питання, в якому описується, що у вас є, і де саме ви застрягли.
Квентін

Дякую друже. До речі, я вирішив проблему. Я використовував динамічні файли
Taimoor Changaiz

20
"Змінити ваш сервер" не працює, якщо ви намагаєтесь використовувати зовнішній API, наприклад LinkedIn .
Дан Даскалеску

1
@Quentin Це має значення, оскільки питання повинні бути корисними для інших, а не лише для ОП. Google вказав на мене тут, і це не допомагає моєму випадку
Хуан Мендес

56

Якщо ваш проксі-сервер або контейнер додає наступний заголовок під час обслуговування файлу .js, він змусить деякі браузери, такі як Chrome, проводити сувору перевірку типів MIME:

X-Content-Type-Options: nosniff

Видаліть це заголовок, щоб перешкодити Chrome виконувати перевірку MIME


14
Погана практика не надавати заголовок типу вмісту ресурсів, що подаються у веб-додатках. Уникнення нюху MIME з боку сервера (за допомогою X-Content-Type-Options: nosniffзаголовка) є хорошим варіантом для запобігання атакам, що обнюхують вміст.
Андрес Моралес

Мені довелося додати це як частину аудиту безпеки - тепер я не знаю, що робити !! :-(
Джеймс Поулоз

11

FYI, у мене така ж помилка в консолі Chrome. Я думав, що моя функція AJAX викликає її, але я прокоментував свій мінімізований сценарій від /javascripts/ajax-vanilla.min.jsдо /javascripts/ajax-vanilla.js. Але насправді вихідний файл був у /javascripts/src/ajax-vanilla.js. Таким чином, у Chrome ви отримуєте погану помилку типу MIME, навіть якщо файл неможливо знайти. У цьому випадку повідомлення про помилку описується як text/plainнеправильний тип MIME.


1
Дуже дякую! Це була і моя проблема. Це було в неправильному каталозі.
Еллісан

2
Ти врятував мене сьогодні 1 годину чемпіона! Спасибі
Beto Aveiga

1

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


У нас була аналогічна проблема, повернутий вміст був 302 (тому що користувач став неаутентифікованим) і у нього взагалі не було типу вмісту -> невиконаний.
Pasi Savolainen

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> Інформаційні послуги Інтернету> Послуги всесвітньої веб-служби> Загальні функції HTTP> Статичний вміст.

Я зіткнувся з цією проблемою при спробі запуску існуючої програми на новій установці IIS 10.0

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.