长请求uri在调用响应对象的redirect()函数时被截断

时间:2018-04-24 17:56:06

标签: node.js express passport.js

在为Passport.js实现自定义身份验证策略的特定Node.js代码中(使用Express 4.6.13),在某些时候执行下一行:

var insertstore = new Shop({ items: storedaily.map(key => key.devName) });

直到传递给 return res.redirect(global.config.applicationEndpoint + '?user=' + queryUserString); 的网址足够短,它才能正常工作。如果传递特别长的res.redirect()(大约8000个字符或更多),它仍然会产生一个重定向响应,其中包含长且模拟有效的请求uri,但是uri明显被截断(先发制人地结束)接近其末尾。有几点需要注意:

  1. 在该行之前放置的日志记录指令允许在queryUserString传递给queryUserString之前将其结束,但它尚未被截断。

  2. 在重定向响应中,此操作在长res.redirect()的情况下生成,但是请求uri IS被截断,在响应主体中传递的uris不是(它们是相同的uris )。然而,它仍然阻止我的应用程序正常工作(我需要这个长期uri通过请求的标题)

  3. 很明显,这里强制实施某种限制。但我找不到任何我可以调整的东西,以便在请求中允许更长时间的uris。

    感谢任何帮助,我在这里没有想法。

1 个答案:

答案 0 :(得分:0)

不确定这是否有帮助,但我对此做了一些调查。

内部res.redirect来电res.location

然后,我们可以看到res.location只调用res.set

但是你可以看到有encodeUrl调用外部依赖

检查来源here显示正在进行一些正则表达式替换:

function encodeUrl (url) {
  return String(url)
    .replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
    .replace(ENCODE_CHARS_REGEXP, encodeURI)
}

我的预感是,您的URI中的字符正在被替换,这会让您相信它被截断了。

我会根据模块使用的正则表达式模式检查你的URI: