Chrome拒绝执行此JavaScript文件


32

在我的HTML页面的顶部,我有:

<script src="https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js"></script>

当我在浏览器(Google Chrome v 27.0.1453.116)中加载页面并启用开发者工具时,它显示:

拒绝从' https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js ' 执行脚本,因为其MIME类型('text / plain')不可执行,并且启用了严格的MIME类型检查。

确实,该脚本不会运行。Chrome为什么认为这是纯文本文件?它显然具有.js文件扩展名。

由于我使用的是HTML5,因此我省略了该type属性,因此我认为这可能是导致问题的原因。因此,我添加type="text/javascript"<script>标签,并得到了相同的结果。我什至尝试type="application/javascript"并仍然遇到相同的错误。

然后我type="text/plain"出于好奇而尝试将其更改为。浏览器没有返回错误,但是JavaScript也没有运行。

最后,我认为文件名中的句点可能会使浏览器无法正常运行。因此,在我的HTML代码中,我将所有句点都更改为URL转义字符%2E

<script src="https://raw.github.com/cloudhead/less%2Ejs/master/dist/less-1%2E3%2E3.js"></script>

这仍然没有用。唯一真正有效的方法(即浏览器没有给出错误并且JS成功运行)是如果我下载文件,将其上传到本地目录,然后将src值更改为本地文件。我不想这样做,因为我想节省自己网站上的空间。

如何让Chrome识别链接文件实际上是JavaScript类型?

Answers:


16

您遇到的问题无法控制,因为这是在您提到的路径上在Github上设置托管的方式,扩展类型不仅是执行文件时要考虑的因素,因为Web托管可以否决如何浏览器呈现文件。

如果设置了主机,则可以将.zip文件呈现为.html文件。您可以使用firebug自己检查此问题,并查看请求的标题响应...。因此,如果您请求JS文件,但标头响应返回的期望值不同,那么浏览器将尊重标头响应,而不是请求的内容...

原始子域上托管的github Content-Type text/plain; charset=utf-8将以MIME类型返回,这意味着它将不以JS身份执行,而是以原始文本身份执行,下面是一个示例,您需要服务器返回以呈现文件,下面是github返回的代码。

支持JS MIME类型的服务器如下所示:

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Encoding    gzip
Content-Length  31097
Content-Type    application/javascript
Vary    Accept-Encoding
Request Headersview source
Accept  text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

这是https://raw.github.com/cloudhead/less.js/master/dist/less-1.3.3.js标题响应为(RAW VIEW)的内容。

Accept-Ranges   bytes
Connection  Keep-Alive
Content-Disposition inline
Content-Encoding    gzip
Content-Length  41354
Content-Transfer-Encoding   binary
Content-Type    text/plain; charset=utf-8

嗯什么 那么解决方法是什么?
pabrams

2
@pabrams使用您的控制范围之内适当的主机修复或使用rawgit
西蒙艾泰

25

2018年12月

由于恶意使用,RawGit现在正在停用,因此,他们建议改为使用以下服务之一:


原始帖子

Rawgithub.com允许用户使用Git的“原始”版本并将其转换为可在<script>标记中使用的URL 。它非常易于使用,只需.从原始URL中删除第一个即可。例如,这:

https://raw.github.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

会变成这个

https://rawgithub.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

然后将其放入<script>具有适当类型的标签中。这么简单!

它们确实限制了请求的数量,因为它仅用于开发目的,而不是用于生产目的。

2014年

如Reinderien所述,rawgithub现在只是rawgit,因此新的脚本链接为

https://rawgit.com/joelambert/CSS-Animation-Store/master/cssanimationstore.js

6
它说在rawgithub主页上,不要在生产站点上使用它。而且它似乎不是Github的官方网站。
DisgruntledGoat 2013年

1
我从未说过没有……
Zach Saucier

1
注意-现在将重定向到rawgit.com。而且有效!
Reinderien 2014年

1
现在,该网站提供了403个请求消息,标头告诉您它正在关闭。
迈克尔

@迈克尔伤心:(幸运rawgit其网站上提供一些替代品,所以我更新我的答案与提供的。
扎克索西耶

6

文件扩展名无关紧要,重要的是Content-Type标头,并且该文件带有text/plain内容类型(这是Github的“原始”视图的目的)。

您实际上应该将文件的副本本地下载到您的站点,并从那里包含它。即使它确实可以从Github上运行,但由于您不是异步加载JS文件,因此将该<script>标签放在页面标题中会使您的网站依赖于Github的可用性。


8
“您应该真正在本地将文件的副本下载到您的站点并从那里包含它”,这就是关键。它不打算从GitHub托管。
章鱼

@Octopus我们可以配置为下载和存储的一个本地副本,然后以编程点脚本吧..
Sudip班达


1

正如bybe指出的那样,问题是raw.github.com所提供的几乎所有内容都以文本文件的形式发送出去-这样,内容就可以在浏览器中以纯文本形式呈现,而不会遇到任何其他应用程序或问题。否则,您将陷入一种情况,即试图查看.js文件可能会导致浏览器尝试运行该文件而不是向您显示。

最重要的是,github和pages.github都没有试图成为CDN。您实际上应该:

  1. 自己托管文件,它不是很大。
  2. 对站点上的此静态文件和其他静态文件使用专用的CDN。
  3. 使用诸如cdnjs.com之类的东西,这些东西可以使用不同版本的lessjs
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.