MIMEタイプが正しくないため、ChromeはAJAXスクリプトの実行を拒否します


146

私はAJAXを介してJSONとしてスクリプトにアクセスしようとしています。これは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タイプはそれに一致しますか?どうやらそうではない。回避策は必要ありません。修正するだけです。
Bergi 14

コールバックを削除してdataType jsonpを使用しても問題は解決しません
Paul Nelligan

2
私は、意味修正サーバの応答を
Bergi、2014

5
@Bergi:サーバーがOPの制御外にある場合はどうなりますか?たぶん彼はLinkedInなどの外部APIを使おうとしているのかもしれません。
Dan Dascalescu 2015年

2
@DanDascalescu:APIが使用できなくなるため、これをバグとして報告する必要があります。これが修正されるのを待つ間、彼はMIMEタイプまたはコンテンツを変更するプロキシを使用できます。
Bergi、2015年

回答:


70

コールバック引数を追加することで、XMLHttpRequestを使用したJSONのリクエストではなく、スクリプト要素を使用したJSONPのリクエストを行うことをjQueryに伝えています。

JSONPはJSONではありません。JavaScriptプログラムです。

サーバーを変更して、JSONPの正しいMIMEタイプであるを出力するようにしますapplication/javascript

(その間、jQueryにJSONを期待していることは矛盾しているので、jQueryに伝えるのをやめてくださいdataType: 'jsonp'。)


1
2つのサイト間でajaxを使用する必要があります。「サーバーを変更して、JSONPの適切なMIMEタイプであるapplication / javascriptを出力するようにサーバーを変更する」について説明します。これを行う方法
Taimoor Changaiz 14

@TaimoorChangaiz —わかりません。静的ファイルを生成する場合は、使用しているサーバーによって異なります。コンテンツを動的に生成する場合は、使用しているプログラミング言語(およびおそらくフレームワーク)に依存します。これまでに何があり、どこに行き詰まっているのかを正確に説明する質問をしてみてください。
クエンティン2014

ありがとう。ところで問題を見つけました。私は動的ファイルを使用していました
Taimoor Changaiz '16

20
LinkedInなどの外部APIを使用しようとしている場合、「サーバーの変更」は機能しません。
Dan Dascalescu 2015年

1
@Quentin問題はOPだけでなく他の人にも役立つはずなので重要です。グーグルは私をここに指し示しました、そしてこれは私の事件を助けません
フアン・メンデス

56

プロキシサーバーまたはコンテナが.jsファイルを提供するときに次のヘッダーを追加する場合、Chromeなどの一部のブラウザーはMIMEタイプの厳密なチェックを実行する必要があります。

X-Content-Type-Options: nosniff

ChromeがMIMEチェックを実行しないようにするには、このヘッダーを削除してください。


14
Webアプリケーションで提供されるリソースのContent-Typeヘッダーを提供しないことは悪い習慣です。サーバー側から(X-Content-Type-Options: nosniffヘッダーを使用して)MIMEスニッフィングを回避することは、コンテンツスニッフィング攻撃を防ぐための優れたオプションです。
アンドレス・モラレス

これをセキュリティ監査の一部として追加する必要がありました-今、私は何をすべきか分かりません!! :-(
James Poulose、

11

ちなみに、Chromeコンソールからも同じエラーが発生します。AJAX関数が原因であると考えましたが、縮小したスクリプトのコメントをからに変更/javascripts/ajax-vanilla.min.jsしました/javascripts/ajax-vanilla.js。しかし、実際にはソースファイルはにありました/javascripts/src/ajax-vanilla.js。したがって、Chromeでは、ファイルが見つからない場合でも、悪いMIMEタイプエラーが発生します。この場合、エラーメッセージはtext/plain不正なMIMEタイプとして説明されています。


1
本当にありがとうございました!これも私の問題でした。間違ったディレクトリにありました。
Ellisan 2017

2
今日は1時間節約できました!ありがとう
Beto Aveiga

1

IIS 7.0でカスタム404エラーページを使用してこのエラーが発生しましたが、404ページで発生すると思われます。サーバーが、(正しく)実行できないtext / html mimeタイプを含むhtml 404応答を返しました。


同様の問題があり、返されたコンテンツは302(ユーザーが認証されなくなったため)で、コンテンツタイプはまったくありませんでした->実行不可。
Pasi Savolainen 2017年

1

レコードおよびGoogle検索ユーザーの場合、.NET Core開発者は、デフォルト値がnullまたは空であるため、コンテンツタイプを手動で設定する必要があります。

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

0

私の場合、私は

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

(FlickrのAPIに)リクエストを送信すると、同じMIMEエラーが発生しました。上記の回答のように、次のコードを追加します。

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

問題を修正し、ChromeのコンソールにMIMEタイプのエラーが表示されなくなりました。


0

アプリケーションがIISでホストされている場合は、静的コンテンツがインストールされていることを確認してください。[コントロールパネル]> [プログラム]> [Windowsの機能を有効または無効にする]> [インターネットインフォメーションサービス]> [World Wide Webサービス]> [共通のHTTP機能]> [静的コンテンツ]。

新しいIIS 10.0インストールで既存のアプリケーションを実行しようとすると、この問題に直面しました

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.