http | https NodeJS模块将目标网址更改为http,导致重定向

时间:2017-03-01 09:36:29

标签: javascript node.js http https preflight

我尝试对github进行API调用。此类API调用不需要身份验证。 该呼叫基本上基于普通的http | https NodeJS模块,但是在浏览器上通过browserify(因此它使用http-browserify或https-browersify)。

我的情况是在我正在制作的库中测试内部缓存。它在NodeJS环境上测试时效果很好,但在浏览器上没有。

概念是缓存目标URL的响应,然后对于后续调用相同的URL,它将首先检查此项是否在内部缓存中。如果是,那么它将从此类缓存项的响应标头字段中获取EtagLast-Modified,以便在If-None-MatchIf-Modified-Since的下一个请求标头中设置。如果来自新请求的响应返回304状态代码,那么我可以安全地从内部缓存返回缓存项。

在Chrome和Firefox上失败但在Safari上失败。

在Chrome上,我得到了

  

Fetch API无法加载http://api.github.com:443/orgs/angrybaozi/repos。预检的响应无效(重定向)

我做了一些研究,这样的错误主要是关于向HTTP发出请求,而不是HTTP。这导致了问题。注入请求标头的相关代码部分可以在https://github.com/haxpor/bfet/blob/master/src/core/core.js#L103-L111看到。这是提出请求的核心代码。只针对此案例的GET请求。

通过查看Chrome Developer Console发现的有趣部分是http | https NodeJS模块,它确实更改了目标HTTPs网址,如下所示。

https://api.github.com/orgs/angrybaozi/repos成为http://api.github.com:443/orgs/angrybaozi/repos。看一下https NodeJS Module Docs,您会看到与此问题相关的hostnameport。我无法在网址中保留https://。由模块来完成工作因此最终改变了一些东西。所以,我只想确认输入https://api.github.com/orgs/angrybaozi/repos

这可能是问题吗?我该如何解决?任何建议都会非常感激。

更新
我缩小了问题的范围。似乎每当我发送If-None-MatchIf-Modified-Since的请求标头然后在Chrome上进行测试时,就会出现上述错误。

1 个答案:

答案 0 :(得分:1)

  

查看https NodeJS模块文档,您会看到与问题相关的hostnameport

与此特定问题最相关的部分是protocol

默认为http:,因此您的请求是针对HTTP URL的。因为它会自动重定向到HTTPS,所以它会在这里混淆跨域请求。

所以明确地将它设置为https:,首先使请求成为HTTPS - 这样,API就不会重定向,一切都应该是o.k. CORS明智的。