是否有一种方法告诉nodejs服务器从浏览器请求中丢弃查询字符串?



问题

我希望我的用户能够分享他们的工作在我的web应用程序与对方简单地通过复制/粘贴完整的URL从地址栏。我传递一个大压缩字符串作为URL查询变量。

大压缩字符串的大小可以是许多kb -这自然会触发HTTP 431错误(请求报头字段太大)。

最后,我想在URL中仅为客户端使用查询字符串。服务器不需要数据,所以我不希望服务器浪费资源来处理它。

是否有可能在低级别拦截节点的请求并忽略完整的url?即使url是foo.com/?bar=[blah blah blah],我也希望服务器将url

设置为foo.com

注意:我不想简单地增加——max-http-header-size,或者允许更大量的数据进入服务器。

我的尝试我尝试过的最有希望的事情是从HTTP模块侦听clientError,这样我至少可以检测到431错误。但是,这感觉不是处理这个问题的正确方法:

//I do NOT want to set the maxHeaderSize option for this
var server = http.createServer((req,res) => {
console.log("got request");
res.write(JSON.stringify(req.url));
res.end();
});
server.listen(3000);
server.on("clientError", (err, socket) => {
console.log("Client error!", socket.writable, err.code);
if (socket.writable) {
if(err.code === 'HPE_HEADER_OVERFLOW'){
//not sure what I would do here
//doing socket.write has not worked for me
//doing socket.end has not worked for me
}else{
socket.write("HTTP/1.1 400 Client Errorrn");
socket.write("Connection: closern");
socket.write("rn");
}
}
socket.destroy(err);
})

这是一个俗气的答案,但它应该工作。我认为,如果你发送的数据很大,你应该实现一个专用的导入/导出机制。

如果你坚持——确实有一种方法可以在URL中传递信息而不用通过网络发送。它在RFC 1808章节2.4.1中定义。它是片段标识符.

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

我们对这里的片段位感兴趣。我们可以通过在URL的末尾添加一个标签(#)并输入数据来传递URL中的片段。

因此,我建议在URL的末尾包括长压缩数据,如:

https://example.com/my/path/site.html#bG90cyBvZiBkYXRhIGhlcmU...

在客户端读取片段

在客户端,应该在window.location.hash填充片段数据。

if (window.location.hash) {
// fragment exists and is stored in the ``hash'' variable
do_something(window.location.hash);
} else {
// nothing to load
}

合理的警告

我已经浏览了规范,它似乎没有指示片段标识符的最大大小。但是,请记住,它不是为此目的而设计的,不同的客户端可能以不同的方式处理长片段。

最新更新