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 的后续调用,它将首先检查该项目是否在内部缓存中。如果是这样,那么它将从此类缓存项的响应标头字段中获取Etag
或Last-Modified
,以在If-None-Match
或If-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,您将看到与问题相关的hostname
和port
。我不能在网址中保留https://
。由模块来完成工作,因此最终会改变一些东西。再说一次,我只是想确认我输入了https://api.github.com/orgs/angrybaozi/repos
。
这可能是问题吗?我该如何解决?任何建议将不胜感激。
更新
我缩小了问题范围。似乎每当我发送If-None-Match
或If-Modified-Since
的请求头然后在Chrome上测试时,就会发生上述错误。
【问题讨论】:
“查看 https NodeJS Module Docs,您会看到与问题相关的hostname
和 port
” – 它们有何相关性?我认为与这个特定问题最相关的部分是protocol
,不是吗?
@CBroe 哦,哇,伙计。这样就解决了问题!老实说,我看了很多次文档,但从未见过protocol
字段。你能把你的建议变成答案吗?我会接受的。谢谢!
【参考方案1】:
查看https NodeJS Module Docs,您将看到与问题相关的
hostname
和port
”
与这个特定问题最相关的部分是protocol
。
默认为http:
,这就是为什么您的请求会发送到 HTTP URL。而且因为它会自动重定向到 HTTPS,所以它会在此处搞乱跨域请求。
因此,将其明确设置为https:
,以首先使请求成为 HTTPS 请求 - 这样,API 不会重定向,一切都应该没问题。 CORS 方面。
【讨论】:
除此之外,在我应用您的解决方案之前,我可以通过在基于https
而不是本地主机上点击包含此类 API 调用的网页来使其在浏览器上运行。但是是的,设置protocol
是可行的方法。以上是关于http | https NodeJS模块将目标网址更改为http,导致重定向[关闭]的主要内容,如果未能解决你的问题,请参考以下文章