在为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明显被截断(先发制人地结束)接近其末尾。有几点需要注意:
在该行之前放置的日志记录指令允许在queryUserString
传递给queryUserString
之前将其结束,但它尚未被截断。
在重定向响应中,此操作在长res.redirect()
的情况下生成,但是请求uri IS被截断,在响应主体中传递的uris不是(它们是相同的uris )。然而,它仍然阻止我的应用程序正常工作(我需要这个长期uri通过请求的标题)
很明显,这里强制实施某种限制。但我找不到任何我可以调整的东西,以便在请求中允许更长时间的uris。
感谢任何帮助,我在这里没有想法。
答案 0 :(得分:0)
不确定这是否有帮助,但我对此做了一些调查。
内部res.redirect
来电res.location
:
然后,我们可以看到res.location
只调用res.set
:
但是你可以看到有encodeUrl
调用外部依赖
encodeUrl
导入:https://github.com/expressjs/express/blob/master/lib/response.js#L18 encodeUrl
来源:https://github.com/pillarjs/encodeurl 检查来源here显示正在进行一些正则表达式替换:
function encodeUrl (url) {
return String(url)
.replace(UNMATCHED_SURROGATE_PAIR_REGEXP, UNMATCHED_SURROGATE_PAIR_REPLACE)
.replace(ENCODE_CHARS_REGEXP, encodeURI)
}
我的预感是,您的URI中的字符正在被替换,这会让您相信它被截断了。
我会根据模块使用的正则表达式模式检查你的URI: