我有一个在域A上的HTTPS上运行的rest服务(实现为Azure功能)。
我有一个网站,该网站在域B的HTTPS上运行。
我为cors指定了通配符*。
在网站上使用jQuery,我将Ajax请求发送到其余服务。这项工作正常,我可以看到我的GET
请求由OPTIONS
进行了预审核。
在开发我的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?
答案 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)
据我所知,这里做了一些事情。
HTTPS域到HTTP本地主机正确地导致CORS验证。我相信我已经为服务正确配置了CORS。
但是,我认为浏览器在处理localhost时有特定的行为,这导致了我的问题。
我在HTTPS上使用Rest test test,在HTTP上使用本地托管的JSON Server,以在我的rest服务(Azure函数)之外运行测试。
我正在将这些测试与位于JSONPlaceholder的JSON Server的HTTPS托管版本进行比较。
我正在做两种类型的测试,simple and preflighted,因为它们引发了不同的行为。预检前有一个自定义标头,该标头导致在OPTIONS
之前发出GET
请求。
TL / DR:简单的预检请求在Firefox或Chrome上不起作用。
要允许混合内容(HTTPS中的HTTP)保护必须被禁用,否则什么也不会发生,并且控制台中显示Blocked loading mixed active content
错误。
但是,即使禁用保护,Firefox仍将继续阻止简单的预检请求。对于预检请求,Firefox不会发出任何请求。控制台中会显示有关混合内容和CORS的警告。
必须禁用类似于Firefox的保护,以允许混合内容。
与Firefox一样,Chrome不会成功执行任何请求,但是会发出预检OPTIONS
。
TL / DR:在Chrome中,简单的预检请求有效。对于Firefox,仅简单请求即可。
似乎Firefox和Chrome上有一些工作,因此http://127.0.0.1/不被视为混合内容。似乎WebKit/Safari的人群仍在考虑这一问题。
自Firefox 55起,允许在 http://127.0.0.1/(请参见错误903966)。 Chrome浏览器允许混合内容 http://127.0.0.1/和http://localhost/。 Safari不允许任何 混合内容。
基于上述测试,我不确定Chrome上的localhost是否为真(至少现在是这样)。
启用保护后,Firefox可以处理简单的请求。预检请求仍然失败,但仅显示CORS警告(我不确定这可能是Firefox中的错误)。
启用保护后,简单的预检请求即可工作。
回到实现为Azure Functions的我的其余服务。我以为我可以使用Chrome在127.0.0.1以上测试我的服务。
不幸,这也不起作用。
Azure函数是hardcoded至localhost,似乎对127.0.0.1没有响应。例如。我什至无法浏览127.0.0.1上的API,更不用说进行Web服务调用了。
需要一种替代方法,我尝试为HTTPS设置Azure功能。 How to run Azure Function locally within Visual Studio on HTTPS?