Boo's Blog

Stay foolish, Stay hungry

这周接手一个需求,需要做一个Http“代理”,将请求转发至不同的场景。

本来不是多复杂的需求,实现起来也没花多久,反而是在部署测试上面,耗费不少时间。

本地测试一切正常之后,变将代码部署至服务端,因为服务器使用宝塔,部署过程也很快。

可是问题就出在了,测试过程中。

起初我只是察觉,代理服务端收到请求之后,一直没有将请求转发出去,于是查看请求日志,发现满屏的http 444

这个时候,我只是比较困惑,本地发送相同的请求都是正常的,怎么来自客户端的请求就有问题了。

于是,查了一下这个 444 状态码。

它实际上并不是一个标准的 HTTP Status Codes,而是Nginx 自定义的一个Code,通常用于服务端没有返回信息给客户端并且关闭了连接的场景。

服务端的Nginx 为什么会关闭连接?通常由以下两类原因引起:

  1. 客户端发送恶意的请求
  2. 客户端发送格式错误的请求

想清楚这两点之后,我对比了一下本地发送的请求,与客户端发送的请求之间的差异:

本地:

1
2
3
4
curl --location --request POST 'http://xxx.xxx.com/route' \
--header 'User-Agent: PostmanRuntime/7.28.2' \
--form 'params=xxxx' \
--form 'params=xxxx'

客户端:

1
2
3
4
curl --location --request POST 'http://xxx.xxx.com/route' \
--header 'User-Agent: Apache-HttpClient/4.4.1' \
--form 'params=xxxx' \
--form 'params=xxxx'

除了User-Agent 不同,其余信息均一致。

为了验证我的猜想,打开宝塔的Nginx 防火墙站点日志,果然,全部被拦截了:

至于为什么UA 中携带了Apache-HttpClient/4.4.1 这几个关键字就被拦截了,可以通过宝塔默认的User-Agent过滤 规则中找到答案:

可以很清晰地看到,关键词过滤规则中,有一个Apache-HttpClient

知道原因之后就好办了,将关键词过滤的开关给关了,服务即可正常访问。

评论