http|https NodeJS 模块将目标 url 更改为 http,这会导致重定向

http|https NodeJS module change target url to be in http which causes redirect

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

我的情况是测试我正在制作的库中的内部缓存。在 NodeJS 环境下测试但在浏览器上测试时它工作正常。

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

它在 Chrome 和 Firefox 上失败,但在 Safari 上没有。

在 Chrome,我得到了

Fetch API cannot load http://api.github.com:443/orgs/angrybaozi/repos. Response for preflight is invalid (redirect)

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

我通过查看 Chrome 开发者控制台发现的有趣部分是最后的 http|https NodeJS 模块,它确实改变了目标 HTTPs url 如下。

https://api.github.com/orgs/angrybaozi/reposhttp://api.github.com:443/orgs/angrybaozi/repos。查看 https NodeJS Module Docs,您会看到与问题相关的 hostnameport。我无法在 url 中保留 https://。由模块来完成工作,从而在最后改变一些东西。再说一次,我只想确认我输入了 https://api.github.com/orgs/angrybaozi/repos.

会不会是这个问题?我该如何解决?任何建议将不胜感激。

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

Take a look at https NodeJS Module Docs, you will see hostname, and port which are relevant to the problem”

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

默认为 http:,所以这就是您向 HTTP URL 发出请求的原因。因为那会自动重定向到 HTTPS,所以它弄乱了这里的跨域请求。

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