我希望我的用户只需从地址栏中复制/粘贴完整的 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);
})
答案 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
}
我浏览了规范,它似乎没有指出片段标识符的最大大小。但是,请记住,它并不是为此目的而设计的,不同的客户端可能会以不同的方式处理长片段。