Chrome说“资源被解释为脚本,但以MIME类型的text / plain传输。”,这有什么用呢?


316

在FF和所有语言中,我的JavaScript正常运行。但是在Chrome中,它会显示以下消息:

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

我已经检查了所有脚本标签,并且都具有MIME type="text/javascript"。甚至对jquery和jquery ui都这样说。Chrome怎么了?

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


14
一些代码会有所帮助。无论多么诱人,都不要首先责怪编译器(浏览器),因为您几乎总是会犯错。
msw

出于好奇,您使用的是html5吗?
2011年

Answers:


203

这意味着服务器正在通过以下方式发送Javascript HTTP响应:

Content-Type: text/plain

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

Content-Type: application/javascript

3
我正在使用Weblogic Server 11g,但是我不知道在哪里可以配置MIME。拜托,你能给我指路吗?
Shaoz

6
嗯,当没有服务器时,该脚本实际上是本地文件系统上的JSONP文件呢?我猜然后就忽略该警告,因为它不严重并且超出您的控制范围?
hippietrail 2012年

2
它应该是content-type:application/javascript,虽然,application/x-javascript不是一个RFC或ECMAScript标准。
Jasdeep Khalsa 2013年

有很多类似的问题。这个答案对我来说是一个简单的解决方法:stackoverflow.com/a/12057490/1617395
Joe Leo

@JoeLeo:那是针对IIS的。
SLaks 2013年

124

这与jQuery或客户端脚本代码的任何古怪无关。它是服务器端的问题:服务器(端应用程序)未发送客户端脚本资源的预期HTTP Content-Type标头字段值。如果Web服务器的配置不足,配置错误,或者服务器端应用程序(例如PHP)正在生成客户端脚本资源,则会发生这种情况。

适用于ECMAScript实现(例如JavaScript)的MIME媒体类型包括:

  • text/javascript(已注册为过时,未弃用;但仍然有效,并且支持最佳
  • text/ecmascript(已注册为过时,未弃用;但仍然有效
  • application/javascript
  • application/ecmascript

它们包含application/x-javascript,因为上面列出的MIME媒体类型是现在在标准树中注册的MIME媒体类型(因此,不再需要,也不再需要使用实验性媒体类型)。cf. RFC 4329,“脚本媒体类型”(2005 CE)和我的测试用例:对脚本媒体类型的支持

一种解决方案是按照建议配置服务器(如果可能)。对于Apache,这就像添加指令一样简单

AddType text/javascript .js

(有关详细信息,请参见Apache HTTP Server文档)。

但是,如果客户端脚本资源是由服务器端应用程序(例如PHP)生成的,则有必要Content-Type显式设置标头字段值,因为默认值可能是text/html

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

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

即使服务器上有普通的.js文件,如果在提供服务时从它们中删除了注释,如果它们都打包成一个大的响应,则可以很容易地在客户端脚本资源上进行服务器端生成。数量(可能更有效)),或者服务器端应用程序以任何其他方式将其最小化。


1
如果我们无权访问服务器怎么办?
Adonis K. Kakoulidis

1
寻找拥有的人。
PointedEars

非常感谢您的解释。太多的人说一些自大的事情,例如“只是发送JSONP小子,您应该知道怎么做”。当花时间像您一样正确地解释它时,它就像白天一样清晰。这解决了我几个星期以来遇到的问题。再次感谢!

@ Rick-777:我不感激您在没有评论您的更改的情况下更改答案。如果您仔细阅读了我的答案,您就会明白为什么我建议text/javascriptapplication/javascript。如果您有理由相信现在application/javascript是更好的答案,那么您至少应该做的就是在评论中说明自己。它需要Stack Overflow的通知机制让我知道您的更改是不合适的。我已将您的更改(我称为fudging)恢复为该问题的答案,但我认为这些答案不适当。
PointedEars 2015年

19

对于Java Application服务器,例如Weblogic

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


7

我遇到了这个问题,并且想出了解决方法。

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

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


7

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

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

如果定义了其他标头,请替换它,以免出错。
mopsyd 2012年

1
连同PointedEars帖子一起,这帮助我解决了一个似乎没有答案的问题,而且我已经花了好几个星期的时间来思考。非常感谢:D为什么当我在Google中键入“如何在PHP文档中设置标头”时,我得到1000错误的结果,这告诉了我如何做的事情,所以我不知道,但是我终于找到了你的帖子

3

在您的Apache的httpd.conf中,添加以下行:

AddType application/x-javascript .js

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

3

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

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

而不是

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

我以为我会把它放在这里,因为这是搜索错误消息时出现的第一篇文章。


2

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

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

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

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

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


1

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


1

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

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

Web浏览器将其解释为,.js而只是一个网页,指出未找到所需的文件。

这可以工作


1

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


0

我在使用网络框架时遇到了这个问题,并通过将相关的javascript文件移动到指定的(由框架)javascript文件夹中来修复了该问题。


0

当这种情况发生的一个常见的事情是,如果你只是忘记到包括type在脚本中调用。你必须明确地设置它,因为它是-根据W3 - 要求

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>

0

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


0

我遇到了同样的错误,最后(在我的特定情况下)我在部署描述符(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>

0

如果您使用的是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/"/>

0

在我的情况下,服务器发送了正确Content-Type但错误的Content-Encoding。确保仅设置Content-Encoding: gzip压缩后的资源。另外,在我将服务器中的标头(在我的情况下为Google Cloud Storage)中修复后,我不得不等待几分钟,以正确反映由于缓存引起的更改。


0

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

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

-1

尝试通过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和所有其他都没有此问题。


4
eval如果可以帮助,请不要使用:javascripttoolbox.com/bestpractices/#eval
indra 2012年

-1

发布的答案在这里西蒙-萨里斯帮助了我。

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

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

打开regedit并查看以下注册表项:

在此处输入图片说明

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

最终,铬可以再次轻松呼吸。

我应该注意,Windows 7在默认情况下既没有Content Type也没有PercievedType,因此您可以安全地将它们都删除,但是您要做的最少就是编辑。

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

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


嗨假 抄袭是不好的。(mmmmkay?)我已经按照SO 指南编辑了您的答案,以消除窃。
塞缪尔·哈默
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.