由于 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 脚本的主要内容,如果未能解决你的问题,请参考以下文章