由于 MIME 类型错误,Chrome 拒绝执行 AJAX 脚本

Posted

技术标签:

【中文标题】由于 MIME 类型错误,Chrome 拒绝执行 AJAX 脚本【英文标题】:Chrome refuses to execute an AJAX script due to wrong MIME type 【发布时间】:2014-08-23 01:44:44 【问题描述】:

我正在尝试通过 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);
    
);

有人有解决办法吗?

【问题讨论】:

那么,这个资源是什么? JSONP 脚本还是 JSON 文件?它的 MIME 类型是否匹配?显然不是。无需解决方法,只需修复即可。 移除回调并使用 dataType jsonp 并不能解决问题 我的意思是,修复 服务器响应 @Bergi:如果服务器不在 OP 的控制范围内怎么办?也许他正在尝试使用external API such as LinkedIn。 @DanDascalescu:他应该将此作为错误报告,因为它使 API 无法使用。在等待修复此问题时,他可以使用 proxy 来更改 mime 类型或内容。 【参考方案1】:

通过添加回调参数,您告诉 jQuery 您希望使用脚本元素发出 JSONP 请求,而不是使用 XMLHttpRequest 请求 JSON。

JSONP 不是 JSON。它是一个 javascript 程序。

更改您的服务器,使其为 JSONP 输出正确的 MIME 类型,即application/javascript

(当你这样做时,不要告诉 jQuery 你期待 JSON,因为这是矛盾的:dataType: 'jsonp')。

【讨论】:

我必须在两个站点之间使用 ajax。引导我了解您正在谈论的设置“更改您的服务器,以便它为 JSONP 输出正确的 MIME 类型,即 application/javascript”。如何做到这一点 @TaimoorChangaiz — 我不能告诉你。如果您要生成静态文件,则取决于您使用的服务器。如果您正在动态生成内容,则取决于您使用的编程语言(可能还有框架)。试试asking a question,它描述了你到目前为止所拥有的东西以及你卡在哪里。 谢谢哥们。顺便说一句,我发现了问题。我使用的是动态文件 如果您尝试使用external API such as LinkedIn,则“更改您的服务器”不起作用。 @Quentin 这很重要,因为问题应该对其他人有所帮助,而不仅仅是 OP。谷歌在这里指出了我,这对我的情况没有帮助【参考方案2】:

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

X-Content-Type-Options: nosniff

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

【讨论】:

不提供 Web 应用程序中提供的资源的 Content-Type 标头是一种不好的做法。避免从服务器端进行 MIME 嗅探(使用 X-Content-Type-Options: nosniff 标头)是防止内容嗅探攻击的好选择。 我不得不将其添加为安全审计的一部分——现在我不知道该怎么做!! :-(【参考方案3】:

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

【讨论】:

非常感谢!这也是我的问题。它在错误的目录中。 今天冠军为我节省了 1 小时!谢谢【参考方案4】:

为了记录和谷歌搜索用户, 如果您是 .NET Core 开发人员,则应手动设置内容类型,因为它们的默认值为 null 或空:

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

    ContentTypeProvider = provider
);

【讨论】:

【参考方案5】:

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

【讨论】:

我们遇到了类似的问题,返回的内容是 302(因为用户未经身份验证)并且它根本没有内容类型 -> 不可执行。【参考方案6】:

就我而言,我使用

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

发出请求(向 Flickr 的 API),我得到了同样的 MIME 错误。 就像上面建议的答案一样,添加以下代码:

$.ajaxSetup( dataType: "jsonp" );

修复了这个问题,我在 Chrome 的控制台中不再看到 MIME 类型错误。

【讨论】:

【参考方案7】:

如果应用程序托管在 IIS 上,请确保已安装静态内容。控制面板 > 程序 > 打开或关闭 Windows 功能 > Internet 信息服务 > 万维网服务 > 通用 HTTP 功能 > 静态内容。

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

【讨论】:

以上是关于由于 MIME 类型错误,Chrome 拒绝执行 AJAX 脚本的主要内容,如果未能解决你的问题,请参考以下文章

由于 MIME 类型错误而拒绝应用样式

拒绝执行脚本并启用严格的 MIME 类型检查

拒绝执行脚本 runtime.js,因为 MIME 类型不可执行

拒绝执行脚本,启用严格的 MIME 类型检查?

由于 MIME 类型,我的 html 上出现错误

拒绝执行脚本,因为 MIME 类型 ('text/html') 不可执行,并且启用了严格的 MIME 类型检查