【问题标题】:Why are my requests from HTTPS domain to HTTP localhost failing CORS?为什么我从 HTTPS 域到 HTTP localhost 的请求失败了 CORS?
【发布时间】:2018-07-11 18:56:43
【问题描述】:

我有一个休息服务(作为 Azure 函数实现),在 HTTPS 上运行,在域 A 上。

我有一个网站,在域 B 上运行 HTTPS。

我为 cors 指定了通配符 *。

在网站上使用 jQuery,我将 Ajax 请求发送到其余服务。这可行,我可以看到我的 GET 请求由 OPTIONS 预检。

当我开发我的休息服务时,我想在本地托管服务,在 HTTP 上运行,在 localhost 域上。这似乎不起作用。

我必须启用混合内容,但浏览器 (Firefox) 似乎没有发送或预检我的请求 - 网络流量为空。我的请求似乎未能通过 CORS 请求。

这会出现在 Firefox 控制台中。

16:42:56.550 Loading mixed (insecure) active content "http://locahost:7071/api/test/get?message=get+hello+world!" on a secure page[Learn More] ajax.ts:153:23
16:42:56.558 Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://locahost:7071/api/test/get?message=get+hello+world!. (Reason: CORS request did not succeed).

我可以通过将我的本地 url 设置为 //locahost 来避免混合内容错误,但这仍然会导致 CORS 失败。

这是因为我试图从 HTTPS 域到 HTTP localhost 执行 CORS 吗?

【问题讨论】:

  • 如果您将 http:// 硬编码到您的 ajax 网址中,请尝试将其更改为 //。如果您执行以// 开头的ajax 请求,它将使用页面首次加载时使用的任何协议。这样您就可以避免使用与页面不同的协议。
  • 您的local.settings.json 文件中有"CORS": "*" 属性吗?
  • @MarkC。是的,我也尝试过提供 --cors * 作为应用程序参数。
  • @Taplar,好主意,但结果相似。浏览器预检了对 https:// 的请求,我的服务没有响应,所以 CORS 仍然失败。
  • 它可能仍然无法通过 CORS,但这应该可以解决您的混合活动内容错误。

标签: javascript ajax rest cors azure-functions


【解决方案1】:

此页面显示详细原因:默认阻止混合内容。 https://developer.mozilla.org/en-US/docs/Web/Security/Mixed_content/How_to_fix_website_with_mixed_content

如果您没有设置允许的域列表,您还必须启用本地 https,不仅 Firefox,而且 Chrome 和 IE 都会阻止从 https 到 http 的请求。 顺便说一句,您不能在本地主机中使用自分配证书,它也会因另一个错误而被阻止。

【讨论】:

  • 虽然涵盖了混合内容并且是有道理的,但它没有提及我认为是真正问题的 CORS 的任何内容。例如。我可以在浏览器中启用混合内容,但仍然收到相同的错误。
  • 展开,我不确定您的回答是仅关于混合内容,还是混合内容和 CORS?
  • 其实两者都有。混合内容错误仅发生在 cors 请求中,特别是 https 到 http,它是多个域。我去年的用法和你的完全一样。白名单在某处也不起作用,无论您如何设置http,我最终的解决方案是将本地主机切换为https,然后为其分配一个好的证书。
【解决方案2】:

进行了一些挖掘,据我所知,这里有一些东西在起作用。

CORS

HTTPS 域到 HTTP localhost 正确地导致 CORS 验证。我相信我已经为我的服务正确配置了 CORS。

但是我相信浏览器在处理 localhost 时有特殊的行为,这导致了我的问题。

测试

我在 HTTPS 上使用 Rest test test,在 HTTP 上使用本地托管的 JSON Server 在我的休息服务 (Azure Functions) 之外运行测试。

我将这些测试与JSONPlaceholder 的 HTTPS 托管版本的 JSON 服务器进行比较。

我正在做两种类型的测试,simple and preflighted,因为它们会引发不同的行为。 Preflighted 有一个自定义标头,它会在 GET 之前生成 OPTIONS 请求。

在禁用保护的本地主机上的浏览器行为

TL/DR:简单的预检请求不适用于 Firefox 或 Chrome。

火狐

要允许混合内容(HTTPS 中的 HTTP)保护,必须禁用,否则什么都不会发生,Blocked loading mixed active content 错误会显示在控制台中。

但是,即使禁用了保护,Firefox 也会继续阻止简单的预检请求。对于预检请求,Firefox 不会发出任何请求。有关混合内容和 CORS 的警告显示在控制台中。

必须禁用类似 Firefox 的保护才能允许混合内容。

与 Firefox 一样,Chrome 不会成功执行任何请求,但会发出预检 OPTIONS

启用保护的 127.0.0.1 上的浏览​​器行为

TL/DR:在 Chrome 中,简单的预检请求有效。对于 Firefox,只有简单的请求有效。

FirefoxChrome 似乎有一些工作,所以 http://127.0.0.1/ 不被视为混合内容。看起来WebKit/Safari 的人群还在考虑这个问题。

The MDN docs have this note.

从 Firefox 55 开始,允许加载混合内容 http://127.0.0.1/(参见错误 903966)。 Chrome 允许混合内容 http://127.0.0.1/http://localhost/。 Safari 不允许任何 混合内容。

根据上面的测试,我不确定 Chrome 上的 localhost 是否正确(至少现在如此)。

火狐

启用保护后,Firefox 适用于简单请求。预检请求仍然失败,但只显示 CORS 警告(这可能是 Firefox 中的错误,我不确定)。

启用保护后,简单的预检请求即可工作。

Azure 函数

回到作为 Azure Functions 实现的我的休息服务。我以为我可以使用 Chrome 在 127.0.0.1 上测试我的服务。

不幸的是,这也行不通。

Azure Functions 是 hardcodedlocalhost,似乎没有响应 127.0.0.1。例如。我什至无法浏览到我在 127.0.0.1 上的 API,更不用说进行 Web 服务调用了。

需要另一种方法,我尝试为 HTTPS 设置 Azure Functions。 How to run Azure Function locally within Visual Studio on HTTPS?

【讨论】:

  • 客户总是会拒绝解决方案:通过终止用户手动启用混合内容。一旦浏览器刷新缓存,该设置将丢失。和客户经理不希望他们的用户手动设置它,也不希望他们学习更多来处理技术问题。实际上,在我切换到 https 之前,我希望他们暂时使用该选项,但他们更愿意等待完美的解决方案。
  • @Dongdong,这只是开发过程中的测试,不会部署给用户。
  • 当然。而且这个设置在chrome中更容易,但对于IE家族和Safari来说很难。
猜你喜欢
  • 2020-03-28
  • 2014-11-23
  • 2014-10-19
  • 2014-02-14
  • 2021-05-22
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2014-05-02
相关资源
最近更新 更多