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

Posted

技术标签:

【中文标题】http | https NodeJS模块将目标网址更改为http,导致重定向[关闭]【英文标题】:http|https NodeJS module change target url to be in http which causes redirect [closed] 【发布时间】:2017-07-20 13:38:52 【问题描述】:

我尝试对 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 发出请求,而不是 HTTPs。这导致了问题。注入请求标头的代码的相关部分可以在这里看到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/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上测试时,就会发生上述错误。

【问题讨论】:

“查看 https NodeJS Module Docs,您会看到与问题相关的 hostnameport – 它们有何相关性?我认为与这个特定问题最相关的部分是protocol,不是吗? @CBroe 哦,哇,伙计。这样就解决了问题!老实说,我看了很多次文档,但从未见过protocol 字段。你能把你的建议变成答案吗?我会接受的。谢谢! 【参考方案1】:

查看https NodeJS Module Docs,您将看到与问题相关的hostnameport

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

默认为http:,这就是为什么您的请求会发送到 HTTP URL。而且因为它会自动重定向到 HTTPS,所以它会在此处搞乱跨域请求。

因此,将其明确设置为https:,以首先使请求成为 HTTPS 请求 - 这样,API 不会重定向,一切都应该没问题。 CORS 方面。

【讨论】:

除此之外,在我应用您的解决方案之前,我可以通过在基于https 而不是本地主机上点击包含此类 API 调用的网页来使其在浏览器上运行。但是是的,设置protocol 是可行的方法。

以上是关于http | https NodeJS模块将目标网址更改为http,导致重定向[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用nodejs做爬虫程序

如何使用nodejs搭建一个简单的https服务器

如何使用nodejs做爬虫程序

如何使用nodejs做爬虫程序

nodejs零基础详细教程2:模块化fs文件操作模块http创建服务模块

NodeJS学习笔记之Http模块