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 的重定向缺少标头授权的主要内容,如果未能解决你的问题,请参考以下文章