NodeJS:使用 res.writeHead 的重定向缺少标头授权

Posted

技术标签:

【中文标题】NodeJS:使用 res.writeHead 的重定向缺少标头授权【英文标题】:NodeJS: header authorization missing from redirect using res.writeHead 【发布时间】:2021-09-04 10:36:53 【问题描述】:

我想将一个 HTTP 请求重定向到另一个 NodeJS 服务器。 我正在使用res.writeHead 来重定向请求。

代码替代 1:

   let headers = Object.assign(,req.headers)
   await Object.entries(headers).forEach(async ([header,value]) => 
         await res.setHeader(header,value)
   )
   await res.setHeader('Location',ENV_CONFIG.ENV_US_URL + req.url)
   res.writeHead( 307 );
   res.end();

代码替代 2:

   let headers = Object.assign(,req.headers)
   headers['Location'] = ENV_CONFIG.ENV_US_URL + req.url
   res.writeHead( 307, ...headers );
   res.end();

代码替代 3:

   let headers = Object.assign(,req.headers)
   res.writeHead( 307, 'Location': ENV_CONFIG.ENV_US_URL + req.url,...headers );
   res.end();

三种备选方案提供相同的结果。 res headers 在发送到其他 NodeJS 服务器之前确实包含 authorization 标头。

当“新”请求到达另一个 NodeJS 服务器时,authorization 标头丢失

请求标头DO包含authorization标头。

为什么authorization 标头会掉在那里?

顺便说一句。我尝试在某些 custom 标头中设置 authorization header 的值,它也丢失了。

【问题讨论】:

【参考方案1】:

当您进行重定向时,浏览器不会保留身份验证标头和其他自定义标头等标头。浏览器对您在重定向响应中指定的location 形成一个新请求,并使用默认标头而不是重定向响应中的标头构建该新请求。就好像用户在浏览器的 URL 栏中输入了重定向的 URL,并且浏览器创建了一个新的、默认的对该新 URL 的请求。

您需要通过 URL 路径、查询参数或 cookie 将信息传递给重定向的请求。查询参数和 URL 路径将始终存在于重定向的请求中,如果 cookie 设置在重定向目标的域上,则将存在 cookie。

当“新”请求到达其他 NodeJS 服务器时,授权标头丢失

重定向浏览器时不保留标题。浏览器创建一个带有默认标头的新请求,指向重定向中指定的location。您要与新目标通信的任何信息都必须在重定向 URL(路径或查询参数)中或在目标域上设置的 cookie 中。

【讨论】:

以上是关于NodeJS:使用 res.writeHead 的重定向缺少标头授权的主要内容,如果未能解决你的问题,请参考以下文章

nodeJS基础08:读取图片

如何使用nodejs提供图像

nodejs之路由

nodejs初探

Nodejs 发送部分响应

nodejs创建服务器