Chrome 说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,啥给出?

Posted

技术标签:

【中文标题】Chrome 说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,啥给出?【英文标题】:Chrome says "Resource interpreted as script but transferred with MIME type text/plain.", what gives?Chrome 说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,什么给出? 【发布时间】:2011-03-28 21:36:08 【问题描述】:

在 FF 中,我的 javascript 工作正常。但在 Chrome 中,它给出了这样的信息:

资源解释为脚本,但使用 MIME 类型 text/plain 传输。

我检查了所有脚本标签,它们都有MIME type="text/javascript"。它甚至用 jquery 和 jquery ui 这么说。 Chrome 出了什么问题?

这是什么问题和解决方法?是我必须在浏览器的“选项”中更改还是从服务器更改,还是我必须调整我的代码?

【问题讨论】:

一些代码会有所帮助。永远不要首先责怪编译器(浏览器),无论它多么诱人,因为你几乎总是会出错。 出于好奇,您使用的是html5吗? 【参考方案1】:

奇怪的问题,但这帮助我解决了我的问题。有时即使是最简单的事情也很难弄清楚......

而不是使用 /js/main.css 在我的脚本标签中我使用了js/main.css

是的,它确实有所作为。我坐在 WAMP / Windows 上,没有虚拟主机,只是使用了 localhost/<project>

如果我引用/js/main.css,那么我引用localhost/css/main.css 而不是localhost/<project>/css/main.css

当你想到它时,这很明显,但如果有人偶然发现这一点,我想我会分享这个答案。

【讨论】:

【参考方案2】:

如果您使用的是 AdonisJS(例如 REST API),避免这种情况的一种方法是这样定义响应标头:

response.safeHeader('Content-type', 'application/json')

【讨论】:

【参考方案3】:

我收到此调试消息的原因比此处的其他答案更愚蠢:这是当您没有获得足够的睡眠并使用 css 文件的语法引用 js 文件时收到的错误消息。如,

<link rel='stylesheet' type='text/css' href='clearly_javascript.js'/>

而不是

<script src='clearly_javascript.js'></script>

我想我会把它放在这里,因为这是搜索错误消息时出现的第一个帖子。

【讨论】:

【参考方案4】:

在我的例子中,服务器发送了正确的Content-Type,但发送了不正确的Content-Encoding。确保您只为 gzipped 资源设置 Content-Encoding: gzip。此外,在我修复了服务器(在我的例子中是 Google Cloud Storage)中的标头后,我不得不等待几分钟才能正确反映由于缓存而导致的更改。

【讨论】:

【参考方案5】:

对我来说,它只发生在某些页面上,因为我使用 window.location 而不是 $location.url(...); 这解决了我的问题。花了一段时间才弄清楚:)

【讨论】:

【参考方案6】:

如果您正在使用 Joomla!并在尝试包含 (.js) JavaScript 文件时遇到这个烦人的错误,那么以下解决方案适合您。

最可能的问题是您试图包含一个不存在的.js 文件,或者您只是放错了那个.js 文件,而当Joomla!没有找到资源,那么它会返回一个完整的 404 消息,而不是通用的 404 消息,其中包含完整的网页和 html 等。

网络浏览器将其解释为.js,而它只是一个网页,显示找不到所需的文件

这适用于joomla2.5joomla3.0joomla3.1joomla3.2joomla3.3joomla

【讨论】:

【参考方案7】:

如果您使用 php 文件生成 javascript,请将其添加为文件的开头:

<?php Header("Content-Type: application/x-javascript; charset=UTF-8"); ?>

【讨论】:

如果您定义了不同的标头,请将其替换,以免出现错误。 连同 PointedEars 的帖子一起,这帮助我解决了一个似乎没有答案的问题,我已经绞尽脑汁好几个星期了。非常感谢 :D 为什么当我输入谷歌“如何在 PHP 文档中设置标题”时,我得到 1000 个错误结果,这些结果没有告诉我该怎么做,所以我不知道,但我终于找到了你的帖子,哈哈【参考方案8】:

这与 jQuery 或客户端脚本代码的任何怪癖无关。这是一个服务器端问题:服务器(端应用程序)没有为客户端脚本资源发送预期的 HTTP Content-Type header field 值。如果 Web 服务器配置不充分、配置错误或服务器端应用程序(例如 PHP)正在生成客户端脚本资源,则会发生这种情况。

适用于 JavaScript 等 ECMAScript 实现的正确 MIME 媒体类型包括:

text/javascript(注册为废弃,未弃用;但仍然有效支持最佳text/ecmascript(注册为废弃,未弃用;但仍然有效application/javascript application/ecmascript

他们确实包括application/x-javascript,因为上面列出的 MIME 媒体类型是目前在标准树中注册的那些(所以没有必要,也不应该想要,不再使用实验性的)。参照。 RFC 4329,“脚本媒体类型”(2005 CE)和我的Test Case: Support for Scripting Media Types。

一种解决方案是尽可能配置服务器,如已推荐的那样。对于 Apache,这可以像添加指令一样简单

AddType text/javascript .js

(详见Apache HTTP Server documentation)。

但是如果客户端脚本资源是由服务器端应用程序生成的,比如PHP,那么就需要显式设置Content-Type头域值,因为默认可能是text/html

<?php
  header('Content-Type: text/javascript; charset=UTF-8');
  // ...
?>

(该语句和类似语句必须出现在任何其他输出之前 - 请参阅 PHP manual - 否则 HTTP 消息正文被认为已经开始,发送更多标头字段为时已晚。)

服务器端生成很容易发生在客户端脚本资源上,即使您在服务器上有普通的 .js 文件,如果 cmet 在提供服务时从它们中删除,如果它们全部打包成一个大响应 (减少请求的数量,这可能更有效),或者通过服务器端应用程序以任何其他方式最小化它们。

【讨论】:

如果我们无法访问服务器怎么办? 找一个有的人。 非常感谢您的解释。太多人说了一些自大的话,比如“发送 JSONP 小子,你应该知道怎么做”。当花时间像你一样正确地解释它时,它就像白天一样清晰。这解决了我几个星期以来遇到的一个问题。再次感谢! @Rick-777:我不感谢您更改我的答案,甚至没有评论您的更改。如果你仔细阅读我的回答,你就会明白为什么我推荐text/javascript 而不是application/javascript。如果您有理由相信 application/javascript 现在是更好的答案,那么您至少应该在评论中解释自己。它需要 Stack Overflow 的通知机制让我知道您的更改是不合适的。我已将您的更改(我称之为 fudging)还原为我认为不合适的问题的答案。【参考方案9】:

适用于 Weblogic 等 Java 应用服务器

1) 确保您的 weblogic.xml 文件没有错误

喜欢这个:

    <?xml version = '1.0' encoding = 'windows-1252'?>
<weblogic-web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://www.bea.com/ns/weblogic/weblogic-web-app http://www.bea.com/ns/weblogic/weblogic-web-app/1.0/weblogic-web-app.xsd"
                  xmlns="http://www.bea.com/ns/weblogic/weblogic-web-app">
    <container-descriptor>
        <prefer-web-inf-classes>true</prefer-web-inf-classes>
    </container-descriptor>
    <context-root>MyWebApp</context-root>
</weblogic-web-app>

2) 将 javascript 的 mime 类型添加到您的 web.xml 文件中:

    ...
        </servlet-mapping>

        <mime-mapping>    
            <extension>js</extension>        
            <mime-type>application/javascript</mime-type>        
        </mime-mapping>

        <welcome-file-list>
    ...

这也适用于其他 Java 容器 - Tomcat 等。application/javascript 目前是唯一有效的 mime 类型; text/javascript 等其他人已弃用。

3) 您可能需要清除浏览器缓存或按 CTRL-F5

【讨论】:

【参考方案10】:

simon-sarrishere 发布的答案对我有帮助。

这帮助我解决了我的问题。

Visual Studio 安装程序必须在注册表中添加了错误行。

打开 regedit 并查看此注册表项:

看到那把钥匙了吗?内容类型键?将其值从 text/plain 更改为 text/javascript。

chrome 终于可以再次轻松呼吸了。

我应该注意的是,在 Windows 7 上默认情况下既不存在 Content Type 也不存在 PercievedType,因此您可能可以安全地删除它们,但您需要做的最低限度是编辑。

无论如何,我希望这也能为您解决问题!

更改后不要忘记重新启动系统。

【讨论】:

你好假的。抄袭是不好的。 (mmmmkay?)我已经根据 SO guidelines 编辑了您的答案以删除抄袭。【参考方案11】:

如果您使用的是 Spring MVC, 您可以添加以下 mvn 标签以从 Spring Dispatch Servlet 中排除资源文件

<mvc:resources mapping="/js/*.js" location="/js/"/>
<mvc:resources mapping="/css/*.css" location="/css/"/>
<mvc:resources mapping="/images/*.*" location="/images/"/>

【讨论】:

【参考方案12】:

我遇到了同样的错误,最后(在我的特定情况下)我在部署描述符 (web.xml) 中发现了一个问题

问题:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>/</welcome-file>
</welcome-file-list>

解决办法:

<servlet-mapping>
    <servlet-name>SessionController</servlet-name>
    <url-pattern>/SessionController</url-pattern>
</servlet-mapping>
...
<welcome-file-list>
    <welcome-file>desktop.jsp</welcome-file>
</welcome-file-list>

【讨论】:

【参考方案13】:

如果它的 IIS 确保在您的 common HTTP Features 下您已打开 Static Content

【讨论】:

【参考方案14】:

发生这种情况的常见情况是,如果您只是忘记在脚本调用中包含type。您必须明确设置它,因为它是 - 根据W3 - 必需

type (content-type):此属性指定元素内容的脚本语言并覆盖默认脚本语言。脚本语言被指定为内容类型(例如,"text/javascript")。作者必须为此属性提供一个值。此属性没有默认值

浏览器似乎仍然有一个默认值plain/text

例子:

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?sensor=false&language=en"></script>

您也可以在 Apache 配置中为该文件扩展名设置默认值:

<IfModule mod_mime.c>
    AddType text/javascript .js
</IfModule>

【讨论】:

【参考方案15】:

这意味着服务器正在发送一个 Javascript HTTP 响应

Content-Type: text/plain

您需要配置服务器以发送 JavaScript 响应

Content-Type: application/javascript

【讨论】:

我正在使用 Weblogic Server 11g,但我不知道在哪里可以配置 MIME。请问,你能给我指路吗? 嗯,如果没有服务器,但脚本实际上是本地文件系统上的 JSONP 文件怎么办?我想然后忽略警告,因为它不严重并且超出您的控制范围? 它应该是content-type:application/javascript,但application/x-javascript 不是 RFC 或 ECMAScript 标准。 类似的问题还有很多。这个答案对我来说很容易解决:***.com/a/12057490/1617395 @JoeLeo:这是 IIS 的。【参考方案16】:

我在使用 web 框架时遇到了这个问题,并通过将相关的 javascript 文件移动到指定的(由框架)javascript 文件夹来解决它。

【讨论】:

【参考方案17】:

检查你的 js 文件是否真的存在于服务器上。我遇到了这个问题,发现 js 文件没有上传到服务器,服务器实际上返回的是 html 页面——这是服务器上配置的默认文档(例如 default.html)

【讨论】:

【参考方案18】:

我在尝试通过 javascript(在本例中为 jQuery)更改数组中的背景图像时遇到了同样的问题。

无论如何。

而不是这个:

m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')

这样做:

eval("m.setStyle('background-image','url(/templates/site/images/style5/'+backgs[i]+')')");

Chrome javascript 在尝试解析以 ' 结构的元素内的变量时被搞砸了。就我而言,它在插入图像阵列之前停止。它不是解析图像 url + 图像名称(在数组内),而是仅解析图像 url。

您可能需要在代码内部进行搜索,看看它发生在哪里。 FF、IE等都没有这个问题。

【讨论】:

如果你能帮上忙,请不要使用eval:javascripttoolbox.com/bestpractices/#eval【参考方案19】:

我遇到了这个问题,我想出了如何解决它。

当样式 (CSS) 文件与引用 .css 文件的 PHP 文件的编码不同时,就会发生这种情况

例如,在 Unix 编码中使用 jQuery.js 并在 UTF-8 中使用 index.php 会导致此问题,因此您必须将它们设为 UTF-8 或任何其他编码,只要它相同即可。

【讨论】:

【参考方案20】:

在你的 apache 的 httpd.conf 中,添加这样一行:

AddType application/x-javascript .js

【讨论】:

我的“.js”条目在 IIS 8 MIME 类型下有“application/javascript”。当我将“.js”条目更改为“application/x-javascript”时,它起作用了!这源于 ExtJS/ASP.NET/ExtDirect4DotNet 应用程序

以上是关于Chrome 说“资源解释为脚本,但使用 MIME 类型文本/纯文本传输。”,啥给出?的主要内容,如果未能解决你的问题,请参考以下文章

node.js 中的标头 - 套接字 io 资源解释为脚本,但使用 MIME 类型 text/plain 传输:

如何使用 AngularJS 从外部 URL 获取 JSON 并在页面中显示 - 资源解释为脚本但使用 MIME 类型 text/html 传输

哪个高手能说一下chrome的“表单填充”有啥用

IE 说 javascript 函数未定义,但在 Chrome 中可以正常工作

Chrome 说没有“Access-Control-Allow-Origin”标头,但标头在那里

chrome 可以播放 html5 mp4 视频但 html5test 说 chrome 不支持 mp4 视频编解码器