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 传输
IE 说 javascript 函数未定义,但在 Chrome 中可以正常工作