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

IT技术 javascript jquery ajax json google-chrome
2021-01-31 17:10:01

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

有没有人有解决方法?

6个回答

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

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

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

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

如果您尝试使用外部 API(例如 LinkedIn ), “更改您的服务器”将不起作用
2021-03-26 17:10:01
我必须在两个站点之间使用 ajax。指导我了解您正在谈论的设置“更改您的服务器,以便它为 JSONP 输出正确的 MIME 类型,即应用程序/javascript”。如何做到这一点
2021-03-30 17:10:01
@TaimoorChangaiz — 我不能告诉你。如果您生成静态文件,则取决于您使用的服务器。如果您动态生成内容,则取决于您使用的编程语言(可能还有框架)。尝试提出一个问题,描述您目前的情况以及您遇到的问题。
2021-04-02 17:10:01
@Quentin 这很重要,因为问题应该对其他人有帮助,而不仅仅是 OP。谷歌把我指向这里,这对我的情况没有帮助
2021-04-03 17:10:01
谢谢,兄弟。顺便说一句,我想出了问题。我正在使用动态文件
2021-04-11 17:10:01

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

X-Content-Type-Options: nosniff

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

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

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

非常感谢!这也是我的问题。它在错误的目录中。
2021-03-22 17:10:01
你今天为我节省了 1 小时冠军!谢谢
2021-04-03 17:10:01

对于记录和谷歌搜索用户,如果您是 .NET Core 开发人员,您应该手动设置 content-types,因为它们的默认值为 null 或空:

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

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

我们遇到了类似的问题,返回的内容是 302(因为用户未经身份验证)并且它根本没有内容类型 -> 不可执行。
2021-03-12 17:10:01