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 字段中获取 Etag
或 Last-Modified
,以便在下一个请求 header 中为 If-None-Match
或 If-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/repos
到 http://api.github.com:443/orgs/angrybaozi/repos
。查看 https NodeJS Module Docs,您会看到与问题相关的 hostname
和 port
。我无法在 url 中保留 https://
。由模块来完成工作,从而在最后改变一些东西。再说一次,我只想确认我输入了 https://api.github.com/orgs/angrybaozi/repos
.
会不会是这个问题?我该如何解决?任何建议将不胜感激。
更新
我缩小了问题范围。似乎每当我发送 If-None-Match
或 If-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.
我尝试对 github 进行 API 调用。这样的 API 调用不需要身份验证。 该调用基本上基于普通的 http|https NodeJS 模块,但在浏览器上通过 browserify(因此它使用 http-browserify 或 https-browersify)。
我的情况是测试我正在制作的库中的内部缓存。在 NodeJS 环境下测试但在浏览器上测试时它工作正常。
这个概念是缓存目标 URL 的响应,然后对于同一 URL 的后续调用,它将首先检查此类项目是否在内部缓存中。如果是这样,那么它将从此类缓存项的响应 header 字段中获取 Etag
或 Last-Modified
,以便在下一个请求 header 中为 If-None-Match
或 If-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/repos
到 http://api.github.com:443/orgs/angrybaozi/repos
。查看 https NodeJS Module Docs,您会看到与问题相关的 hostname
和 port
。我无法在 url 中保留 https://
。由模块来完成工作,从而在最后改变一些东西。再说一次,我只想确认我输入了 https://api.github.com/orgs/angrybaozi/repos
.
会不会是这个问题?我该如何解决?任何建议将不胜感激。
更新
我缩小了问题范围。似乎每当我发送 If-None-Match
或 If-Modified-Since
的请求 header 然后在 Chrome 上进行测试时,就会发生上述错误。
Take a look at https NodeJS Module Docs, you will see
hostname
, andport
which are relevant to the problem”
与此特定问题最相关的部分是 protocol
。
默认为 http:
,所以这就是您向 HTTP URL 发出请求的原因。因为那会自动重定向到 HTTPS,所以它弄乱了这里的跨域请求。
所以将它显式设置为 https:
,首先使请求成为 HTTPS 请求 - 这样,API 就不会重定向,一切都应该是 o.k. CORS-wise.