链接并执行托管在GitHub上的外部JavaScript文件


545

当我尝试将本地JavaScript文件的链接引用更改为GitHub原始版本时,我的测试文件停止工作。错误是:

拒绝从...执行脚本,因为它的MIME类型(text/plain)无法执行,并且启用了严格的MIME类型检查。

有没有一种方法可以禁用这种行为,或者有一种服务可以链接到GitHub原始文件?

工作代码:

<script src="bootstrap-wysiwyg.js"></script>

非工作代码:

<script src="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js"></script>

3
rawgit.com现在是新域名
穆罕默德·乌默尔


1
@MuhammadUmer-仅在源文件永不更改的情况下rawgit缓存永不更新
vsync

3
2019年:只需跳过所有回答,就可以进行RAW或RAWGIT。Rawgit死了。进入chharwey的答案,并对其进行投票,直至达到顶部。那是个好方法:最简单的方法是使用GitHub官方首选方法。
Marco Faustinelli,

1
使用jsdelivr.com/?docs=gh,它可以工作
AuthorProxy

Answers:


1018

这里一个很好的办法解决这一点,现在,通过使用jsdelivr.net

步骤

  1. 在GitHub上找到您的链接,然后单击“原始”版本。
  2. 复制URL。
  3. 更改raw.githubusercontent.comcdn.jsdelivr.net
  4. /gh/在用户名之前插入。
  5. 删除branch名称。
  6. (可选)插入您想要链接的版本,例如@version(如果您不这样做,则会获得最新版本 -这可能会导致长期缓存)

例子

http://raw.githubusercontent.com/<username>/<repo>/<branch>/path/to/file.js

使用此URL获取最新版本:

http://cdn.jsdelivr.net/gh/<username>/<repo>/path/to/file.js

使用此URL获取特定版本或提交哈希:

http://cdn.jsdelivr.net/gh/<username>/<repo>@<version or hash>/path/to/file.js

对于生产环境,请考虑针对特定的标记或提交哈希而不是分支。使用最新链接可能会导致文件长期缓存,从而导致在推送新版本时不会更新您的链接。通过commit-hash或tag链接到文件使链接对于版本是唯一的。


为什么需要这个?

2013年,GitHub开始使用X-Content-Type-Options: nosniff,它指示更多现代浏览器强制执行严格的MIME类型检查。然后,它以服务器返回的MIME类型返回原始文件,从而防止浏览器按预期使用文件(如果浏览器支持该设置)。

有关此主题的背景,请参考此讨论线程


14
也适用于要点。我能够替换gist.githubusercontent.comrawgist.com它并使其正常工作。
haridsv 2015年

3
我不知道是谁维护这个网站的rawgit,但不要在生产中使用它。您将拥有一个未知的第三方,该第三方可以在您的网站中注入任何JavaScript。
neves

1
@Maciej Krawczyk-是的-正是出于这个原因,该页面明确鼓励您使用特定于提交的链接,而不是分支链接。
Troy Alford

4
rawgit现在停产了(从2018-10-08开始):rawgit.com。建议更新此答案。
chharvey

1
感谢您指出@chharvey-我已经更新了答案以反映jsdelivr.net
Troy Alford



10

GitHub Pages是GitHub针对此问题的官方解决方案。

raw.githubusercontent使所有文件都使用text/plainMIME类型,即使该文件是CSS或JavaScript文件也是如此。因此,https://raw.githubusercontent.com/‹user›/‹repo›/‹branch›/‹filepath›将不是正确的MIME类型,而是纯文本文件,并通过<link href="..."/>或链接<script src="..."></script>不起作用-CSS将不适用/ JS将不会运行。

GitHub Pages将仓库存储在一个特殊的URL,因此您要做的就是检入文件并推送。请注意,在大多数情况下,GitHub Pages要求您提交到特殊分支gh-pages

在新站点(通常是)上https://‹user›.github.io/‹repo›,提交给gh-pages分支的每个文件(最新提交)都位于此url中。因此,您可以通过链接到js文件<script src="https://‹user›.github.io/‹repo›/file.js"></script>,这将是正确的MIME类型。

您有构建文件吗?

就个人而言,我的建议是将此分支并行运行master。在gh-pages分支上,您可以编辑.gitignore文件以检入站点所需的所有dist / build文件(例如,如果您有任何缩小/编译的文件),而在分支上则忽略它们master。这很有用,因为您通常不希望在常规存储库中跟踪构建文件中的更改。每次您要更新托管文件时,只需合并mastergh-pages,重建,提交然后推送即可。

(提示:您可以通过以下步骤在同一提交中合并和重建:)

$ git checkout gh-pages
$ git merge --no-ff --no-commit master  # prepare the merge but dont commit it (as if there were a merge conflict)
$ npm run build                         # (or whatever your build process is)
$ git add .                             # stage the newly built files
$ git merge --continue                  # commit the merge
$ git push origin gh-pages

8

上面的答案清楚地回答了这个问题,但是我想提供另一种选择-一种不同的观点/方法来解决类似的问题。

您还可以使用浏览器扩展名删除文件的X-Content-Type-Options响应头raw.githubusercontent.com。有几个浏览器扩展程序可以修改响应头。

  1. 请求:Chrome + Firefox
  2. 修改标题:Firefox

如果您使用Requestly,我可以建议两种解决方案

解决方案1:使用“修改标题规则”并删除响应标题

脚步

  1. http://www.requestly.in请求安装
  2. 转到规则页面
  3. 单击添加图标以创建规则
  4. 选择修改标题
  5. 给出名称和描述
  6. 选择Remove-> Response->X-Content-Type-Options
  7. 在“源”字段中,输入Url-> Contains->raw.githubusercontent.com

解决方案2:使用替换主机规则

  1. http://www.requestly.in请求安装
  2. 转到规则页面
  3. 单击添加图标以创建规则
  4. 替换raw.githubusercontent.comrawgit.com

查看此屏幕截图以获取更多详细信息在此处输入图片说明

测试方法

我们创建了一个简单的JS Fiddle,以测试是否可以将原始github文件用作代码中的脚本。这是 带有以下代码的小提琴

<center id="msg"></center>

<script src="https://raw.githubusercontent.com/sachinjain024/practicebook/master/web-extensions-master/storage/background.js"></script>
<script>
try {
  if (typeof BG.Methods !== 'undefoned') {
    document.getElementById('msg').innerHTML = 'Script evaluated successfully!';
  }
} catch (e) {
  document.getElementById('msg').innerHTML = 'Problem evaluating script';
}
</script>

如果看到Script evaluated successfully!,则表示您可以在代码中使用原始github文件,否则Problem evaluating script表明从原始github源执行脚本时存在一些问题。

我还在Requestly博客上写了一篇有关此的文章。请参阅它以获取更多详细信息。

希望能帮助到你!!

免责声明:我是Requestly的作者,所以您可以为不喜欢的内容负责。



5

为了使事情简短明了

//raw.githubusercontent.com -> //rawgit.com

请注意,这是由rawgit的开发托管而不是其CDN用于生产托管来处理的


自该答案以来,默认的原始URL似乎已更改,因此现在转换https://raw.githubusercontent.com-> https://rawgit.com否则,此答案最清晰且有效。
mikeym,2015年

4
rawgit现在停产了(从2018-10-08开始):rawgit.com。建议更新此答案。
chharvey

4

我的用例是从我的Bitbucket帐户加载“ bookmarklets ”异常,该限制与Github相同。我想出的解决方法是使用AJAX编写脚本并eval在响应字符串上运行,以下代码段基于该方法。

<script>
    var sScriptURL ='<script-URL-here>'; 
    var oReq = new XMLHttpRequest(); 
    oReq.addEventListener("load", 
       function fLoad() {eval(this.responseText + '\r\n//# sourceURL=' + sScriptURL)}); 
    oReq.open("GET", sScriptURL); oReq.send(); false;
</script>

请注意,添加sourceURL注释是为了允许在浏览器的开发人员工具中调试脚本。


1

当文件上传到github时,您可以将其用作外部源或免费托管。特洛伊·奥尔福德(Troy Alford)对此进行了很好的解释。但是为了使操作更简单,让我告诉您一些简单的步骤,然后可以在站点中使用github原始文件:

这是文件的链接:

https://raw.githubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

现在要执行它,您必须删除https://以及rawgithubusercontent之间的dot(。)

像这样:

rawgithubusercontent.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

现在,当您访问此链接时,您将获得一个可用于调用JavaScript的链接:

这是最后的链接:

https://rawgit.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js

同样,如果您托管一个css文件,则必须如上所述进行操作。这是获得简单链接以调用托管在github上的外部CSS或javascript文件的最简单方法。

我希望这是有帮助的。

参考网址:http ://101helper.blogspot.com/2015/11/store-blogger-codes-on-github-boost-blogger-speed.html


3
rawgit现在停产了(从2018-10-08开始):rawgit.com。建议更新此答案。
chharvey

1

我发现该错误是由于文件开头的注释而显示的,您可以解决此问题,只需创建没有注释的自己的文件并推送至git,就不会显示任何错误

为了证明,您可以使用易于分页的相同代码尝试这两个文件:

没有评论

有评论


1

我和你有同样的问题,我所做的就是更改为

<script type="application/javascript" src="bootstrap-wysiwyg.js"></script>

这个对我有用。


从什么变成什么?请显示之前和之后
亚历山大·米尔斯

0

最简单的办法:
<script type="text/plain" src="http://raw.githubusercontent.com/user/repo/branch/file.js"></script>
通过GitHub上提供服务,

非常

可靠。
随着text/plain
在此处输入图片说明text/plain
在此处输入图片说明


这是最好的解决方案,它有效且意义非凡。
2016年

2
没有。这一切都是为了防止脚本甚至运行
Steven Penny

2
它不会再工作了。在我的Android设备日志中:“不建议使用具有无效类型/语言属性的脚本,并将在2017年1月左右在M56中将其删除。有关更多详细信息,请参阅chromestatus.com/features/5760718284521472 ”。
Jens Hauke

0

raw.github.com并不是对文件资产的真正原始访问,而是由Rails渲染的视图。因此访问raw.github.com比需要的要重得多。我不知道为什么raw.github.com要实现为Rails视图。GitHub没有解决此路由问题,而是添加了X-Content-Type-Options: nosniff标头。

解决方法:

  • 将脚本放到 user.github.io/repo
  • 使用诸如rawgit.com之类的第三方CDN。

对于对此感到困惑的其他人,他们是故意这样做的。您曾经能够简单地用于raw.github.com加载文件-然后github意识到它们被用作CDN,这导致它们的流量过多。结果,他们将其更改为带有X-Content-Type-Options: nosniff标题的这种类型的渲染,特别是为了防止人们以这种方式使用他们的服务。
Troy Alford

0

另外,如果在服务器端生成标记,则只需获取并注入即可。例如,在JSTL中,您可以这样做:

<script type="text/javascript">
    <c:import url="https://raw.github.com/mindmup/bootstrap-wysiwyg/master/bootstrap-wysiwyg.js" />
</script>

他们不允许热链接是有原因的,所以如果您想成为一个好公民,那么可能是不好的形式。我建议您缓存该javascript,并仅在您认为合适时才定期重新获取。


0


原版的

https://raw.githubusercontent.com/antelove19/qrcodejs/master/qrcode.min.js

cdn.jsdelivr.net

https://cdn.jsdelivr.net/gh/antelove19/qrcodejs/qrcode.min.js
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.