有没有办法告诉 nodejs 服务器丢弃来自浏览器请求的查询字符串?

时间:2021-02-15 11:48:03

标签: node.js http server

问题

我希望我的用户只需从地址栏中复制/粘贴完整的 URL,就能够在我的 Web 应用程序中彼此共享他们的工作。我将一个大的压缩字符串作为 URL 查询变量传递。

大压缩字符串的大小可能有很多 KiB——这自然会触发 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 Error\r\n");
            socket.write("Connection: close\r\n");
            socket.write("\r\n");
        }
    }
    socket.destroy(err);
})

1 个答案:

答案 0 :(得分:0)

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

如果您坚持,确实有一种方法可以在 URL 中传递信息,而无需通过网络发送。它在第 2.4.1 节的 RFC 1808 中定义。它是片段标识符

<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
}

一个公平的警告

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