GitHub Pages 上的跨域资源共享问题

58

有没有办法启用跨域资源共享(CORS),使得托管在GitHub Pages上的静态页面可以使用JavaScript进行跨域请求?

举个例子,我们是否能够指示GH Pages以某种方式添加这些HTTP响应头:

Access-Control-Allow-Origin:*  
Access-Control-Allow-Methods:GET,POST
Access-Control-Max-Age: 1000
Access-Control-Allow-Headers:*

在他们的文档中找不到任何内容,并且这...

...GitHub Pages不支持像.htaccess或.conf这样的自定义服务器配置文件...

...听起来并不是很有前途-还是有办法吗?

5个回答

51

编辑: 好耶!看起来GitHub Pages现在支持CORS:https://twitter.com/invisiblecomma/status/575219895308324864

可以通过对enable-cors.org(托管在GitHub Pages上)发出curl请求进行验证。 运行此命令:curl -v enable-cors.org > /dev/null 将返回一个Access-Control-Allow-Origin: *头。

尽管我很想看到这个功能,但在GitHub Pages上没有支持CORS的方法。我们在GitHub Pages上托管http://enable-cors.org ,但我们无法在该网站上启用CORS :)


更新

正如@Styx所指出的那样,GitHub Pages现在始终会重定向到HTTPS。因此,如果您想要确认使用GitHub Pages的特定站点是否允许所有来源,请尝试使用-L(跟随涉及的重定向)进行curl 。例如:

$ curl -vL square.github.io/okhttp 2>&1 | fgrep -i access-control-allow-origin

2
我已经提交了一个功能请求,但老实说这是一段时间以前的事情了,所以我会再找一下。David Jacquel在下面提出了一个很好的观点,即根据您正在提供的数据类型,您可以使用纯JS方法,例如JSONP。这将要求您将数据托管为静态文件,但像Jekyll这样的工具可以帮助生成这些文件。 - monsur
2
我认为这个答案已经不再有效了。根据这条推文:https://twitter.com/invisiblecomma/status/575219895308324864,GitHub员工Ben Toews被认为更新了GitHub页面,以包括每个响应的开放CORS头。这可以通过检查任何示例Pages存储库的enable-cors.org的响应来轻松验证,如@abbr所提到的。也许monsur可以为其他寻找答案的人更新答案...? :-) - Andrew Tomlinson
3
目前我没有看到返回CORS头,所以这个功能可能已经被取消了。 - Gregg Kellogg
@monsur,这个答案似乎又是错误的,因为有限制条件的限制,但我发表评论是为了让你有第一次编辑答案的权利,如果你愿意的话可以将其改回“否”。最好的情况是他们增加了某种形式的小型速率限制访问。 - whitneyland
3
似乎GitHub现在只允许HTTPS页面进行此操作。请相应地更新您的答案。 - Styx
显示剩余2条评论

9
你可以使用CORS代理。
http://cors.io/ 对我很有用。
常规请求:
$.getJSON('https://blockchain.info/stats?format=json',function(data){})

使用代理请求(只需在URL前加上http://cors.io/?

$.getJSON('http://cors.io/?https://blockchain.info/stats?format=json',function(data){})

更新:API文档已经更新,您只需在您的url前加上https://cors.io/?即可。


现在只需使用带有前缀http://cors.io/?http://cors.io/?https://blockchain.info/stats?format=json即可。 - YakovL
9
自2019年末以来,cors.io似乎已经无法使用。如果你在谷歌上搜索CORS代理,你会发现有很多曾经存在过,但没有一个由任何重要人物支持,并且没有一个特别长时间地存活下来。 - George Hawkins

6
FYI,看起来GitHub Pages现在支持CORS(至少在某些情况下)。在这种情况下,使用裸域名的自定义域名(没有www或github子域名)。这意味着使用A记录并避免他们的缓存CDN。
现在当我去enable-cors.org时,我可以在所有资源上看到Access-Control-Allow-Origin: *头部返回(从浏览器开发者工具的网络选项卡中)。在Chrome和Firefox中都是如此。
我在https://isthetubeonstrike.com上使用它来从移动web应用程序跨域访问JSON文件。SSL/TLS是通过CloudFlare提供的。

2
我从几天前提交的支持票据中得到的信息是,对于 GitHub Pages 的 CORS 请求是完全可以接受的。
从另一个页面获取内容,这似乎是原始帖子所询问的内容,这意味着另一个页面的服务器必须设置 CORS 请求,否则它将阻止您的请求。通常,如果确实需要从它们那里获取内容(例如维基百科的 MediaWiki),网站会有公共 API 来解决此问题。

1
在我的情况下,我使用了一个自定义域名,但是我忘记在部署时添加该域名(ng deploy --base-href https://customdomain.com/)。检查开发工具中的网络选项卡,观察URL以检查它是否生成了预期的URL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接