为什么我从HTTPS域到HTTP本地主机的请求失败了CORS?

时间:2018-07-10 15:44:28

标签: javascript ajax rest cors azure-functions

我有一个在域A上的HTTPS上运行的rest服务(实现为Azure功能)。

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

我为cors指定了通配符*。

在网站上使用jQuery,我将Ajax请求发送到其余服务。这项工作正常,我可以看到我的GET请求由OPTIONS进行了预审核。

enter image description here

在开发我的rest服务时,我想在localhost域上以HTTP运行的本地服务。这似乎不起作用。

我必须启用混合内容,但随后看来浏览器(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).

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

是否会发生这种情况,因为我正在尝试从HTTPS域到HTTP本地主机进行CORS?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

据我所知,这里做了一些事情。

CORS

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

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

测试

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

我正在将这些测试与位于JSONPlaceholder的JSON Server的HTTPS托管版本进行比较。

我正在做两种类型的测试,simple and preflighted,因为它们引发了不同的行为。预检前有一个自定义标头,该标头导致在OPTIONS之前发出GET请求。

Base tests

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

TL / DR:简单的预检请求在Firefox或Chrome上不起作用。

Firefox

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

Firefox disable protection

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

Firefox tested on localhost

Chrome

必须禁用类似于Firefox的保护,以允许混合内容。

Chrome protection

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

Chrome localhost

启用保护的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

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

Firefox on 127

Chrome

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

Chrome on 127

天蓝色功能

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

不幸,这也不起作用。

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

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