为啥在 Firefox 中向 google Drive Sheet 发出的这个 CORS 请求会失败? (在 Chrome 中工作)

Posted

技术标签:

【中文标题】为啥在 Firefox 中向 google Drive Sheet 发出的这个 CORS 请求会失败? (在 Chrome 中工作)【英文标题】:Why does this CORS request to a google Drive Sheet fail in Firefox ? (works in Chrome)为什么在 Firefox 中向 google Drive Sheet 发出的这个 CORS 请求会失败? (在 Chrome 中工作) 【发布时间】:2015-12-30 02:50:05 【问题描述】:

我正在尝试使用 jquery ajax 在 javascript 中从客户端请求谷歌表格。

以下代码在 Chrome 中有效,但在 Firefox 中失败。

问题:我怎样才能让它在 Firefox 中工作?

如果是服务器配置问题,这是否意味着无法从 firefox 客户端链接到 google drive 文档?

代码如下:

var url = 'http://docs.google.com/spreadsheets/export?id=1-on_GfmvaEcOk7HcWfKb8B6KFRv166RkLN2YmDEtDn4&exportFormat=csv';
$.ajax(
    url : url,
    type : 'GET',
    dataType : 'text',
    success : function(res, status)
        console.log('status : ' + status);
        console.log(res);
    ,
    error : function(res, status, error)
        console.log('status : ' + status);
        console.log(res);
        console.log(error);
    
);

在 Chrome 中,我收到 307 响应,然后是 200 和所需数据。 在 Firefox 中,我只收到 200 响应,但错误消息类似于“Access-Control-Allow-Origin 标头丢失,同源策略不允许获取此资源”。

【问题讨论】:

顺便说一句,对于任何感兴趣的人,我已经使用 jsonp 描述了下面的解决方法,但是一个天才的 *** mod 删除了它 【参考方案1】:

问题是docs.google.com 没有在重定向上设置 CORS 标头。而且 Chrome 没有执行规范,因此没有遵守规范,因此存在某种安全漏洞。

【讨论】:

如果我想在网页中使用谷歌表格的内容,我有哪些选择?将隐私设置从“任何有链接的人”切换到“在网络上公开”会有帮助吗?或者 jsonp 会起作用吗? 实际上,将链接更改为 HTTPS 似乎可以解决问题。 谢谢。实际上使用 https 它在 Chrome 上也失败了。将发布我想出的解决方法【参考方案2】:

docs.google.com 在 Chrome 的 HSTS 预加载列表中。对http://docs.google.com 的请求被透明地重写为https://docs.google.com,因此不会发生重定向。

我认为如果 Firefox 提取 HSTS 预加载列表的更新副本,这将自行解决。正如 Anne 所说,只需将链接直接更改为 https 即可解决您的用例。

【讨论】:

https 在 Chrome 上也失败了,我使用 jsonp 发布了一个解决方法【参考方案3】:

我通过稍微不同的方式配置 Google Drive 并使用 JSONP 找到了解决方法:

1) 在 Google 云端硬盘中,在网络上发布文档并将共享选项设置为公开

2) 使用 JSON 类型的链接以 JSON 格式导出您的数据,它看起来像:“http://spreadsheets.google.com/feeds/list/YOUR_FILE_ID/od6/public/values?alt=json&callback=myCallback”。您需要附加 &callback=myCallback 才能使用 JSONP。您可以使用 jQuery 进行 JSONP 调用。

3) 要使用数据,需要定义 url 中指定的回调函数,本例为“myCallback”

我在另一个答案中提到了类似的过程,但我认为在这里提及它也很有用,因为它与我面临的问题直接相关。

@EnricoFerreguti 您应该将 YOUR_FILE_ID 替换为您的文件 ID。示例:https://spreadsheets.google.com/feeds/list/1-on_GfmvaEcOk7HcWfKb8B6KFRv166RkLN2YmDEtDn4/od6/public/values?alt=json 来自 http://misterfresh.github.io/react-drive-cms/ 网站。

【讨论】:

该解决方案看起来很有趣,但提供的 url 返回一个错误页面。你应该检查一下吗? @Mister Fresh 你能指定这个答案吗?我对 Web 开发相当陌生,不知道如何调整您的解决方法 @EnricoFerreguti 检查spreadsheets.google.com/feeds/list/… @gustavz 检查misterfresh.github.io/react-drive-cms 的实现示例

以上是关于为啥在 Firefox 中向 google Drive Sheet 发出的这个 CORS 请求会失败? (在 Chrome 中工作)的主要内容,如果未能解决你的问题,请参考以下文章

为啥jquery plusslider在google chrome中不起作用但在firefox中起作用

为啥这个 HTML 在 Google Chrome 和 Firefox 中会产生两种不同的结果?

在 google-map-react 中向 Google 地图添加标记

为啥必须在 C 中向后读取指针声明? [关闭]

如何在 C# Selenium 中向 FirefoxDriverService 添加配置文件规范?

如何在 Meteor 中向 Google 地图添加新标记?