我有一个 nginx 服务器负载平衡几个 express (node.js) 服务器。每次我在查询中收到带有未编码空格的请求时,都会关闭连接,而 nginx 认为它已关闭。然后它向上游的下一个 express 发出相同的请求,得到相同的结果,因此当没有任何事情发生时,整个集群都停止运行。
查看日志,这些请求来自 Mozilla 4 等旧浏览器。我还可以使用 curl 模拟该行为:
curl "http://mysite.com/path/?q=foo bar"
我尝试使用各种正则表达式添加重写规则,以使用 %20 对该空格进行编码:
rewrite "^(.*)\ (.*)$" "$1%20$2" last;
rewrite "^(.*)\s(.*)$" "$1 $2" last;
rewrite "\s" "%20" last;
...
但似乎没有任何效果。是我的正则表达式有问题还是只是 nginx 不允许只切换一个字符?你知道解决问题的其他方法吗?也许在快递/节点级别,以避免它只是关闭连接?