由于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 2014年

删除回调并使用dataType jsonp不能解决问题
Paul Nelligan 2014年

2
我的意思是,解决服务器响应
Bergi 2014年

5
@Bergi:如果服务器在OP的控制范围之外怎么办?也许他正在尝试使用外部API,例如LinkedIn
Dan Dascalescu 2015年

2
@DanDascalescu:他应该将其报告为一个错误,因为它使API无法使用。在等待解决此问题时,他可以使用更改mime类型或内容的代理
Bergi 2015年

Answers:


70

通过添加回调参数,您告诉jQuery您想使用脚本元素而不是使用XMLHttpRequest来请求JSONP来请求JSONP。

JSONP不是JSON。这是一个JavaScript程序。

更改服务器,以便为JSONP输出正确的MIME类型application/javascript

(尽管如此,请不要告诉jQuery您期望使用JSON,因为这是矛盾的:)dataType: 'jsonp'


1
我必须在两个站点之间使用ajax。指导我有关您正在谈论的问题,以设置“更改服务器,使其为JSONP输出正确的MIME类型,即application / javascript”。如何做
Taimoor Changaiz 2014年

@TaimoorChangaiz-我不能告诉你。如果要生成静态文件,则取决于您使用的服务器。如果要动态生成内容,则取决于您使用的编程语言(可能还有框架)。尝试问一个问题该问题描述您到目前为止拥有的东西以及确切的位置。
昆汀2014年

谢谢哥们。顺便说一句,我想出了问题。我使用的是动态文件
Taimoor Changaiz 2014年

20
如果您尝试使用外部API(例如LinkedIn),则“更改服务器”将不起作用。
Dan Dascalescu

1
@Quentin确实很重要,因为问题应该被认为对其他人有帮助,而不仅仅是OP。Google在这里指出了我,这对我的情况没有帮助
Juan Mendes

56

如果您的代理服务器或容器在提供.js文件时添加了以下标头,则将强制某些浏览器(例如Chrome)执行MIME类型的严格检查:

X-Content-Type-Options: nosniff

删除此标头可防止Chrome执行MIME检查。


14
不提供Web应用程序中服务的资源的Content-Type标头是一种不好的做法。避免从服务器端进行MIME嗅探(使用X-Content-Type-Options: nosniff标头)是防止内容嗅探攻击的一个不错的选择。
安德烈斯·莫拉莱斯

我必须将此添加为安全审核的一部分-现在我不知道该怎么办!!:-(
James Poulose '18年

11

仅供参考,我在Chrome控制台中遇到了相同的错误。我以为是我的AJAX函数导致了此错误,但是我取消了对缩小脚本从/javascripts/ajax-vanilla.min.js到的注释/javascripts/ajax-vanilla.js。但实际上,源文件位于/javascripts/src/ajax-vanilla.js。因此,在Chrome中,即使找不到该文件,也会出现严重的MIME类型错误。在这种情况下,错误消息被描述为text/plain错误的MIME类型。


1
非常感谢!这也是我的问题。它在错误的目录中。
Ellisan

2
您今天为我节省了1个小时!谢谢
Beto Aveiga '18

1

我在使用带有自定义404错误页面的IIS 7.0时遇到了此错误,尽管我怀疑任何404页面都会发生这种情况。服务器返回了无法(正确)执行的具有text / html mime类型的html 404响应。


我们有类似的问题,返回的内容是302(因为用户未通过身份验证),并且根本没有内容类型->不可执行。
帕西·萨沃拉宁

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功能> Internet信息服务>万维网服务>通用HTTP功能>静态内容。

尝试在新的IIS 10.0安装上运行现有应用程序时遇到了此问题

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.