这周接手一个需求,需要做一个Http“代理”,将请求转发至不同的场景。
本来不是多复杂的需求,实现起来也没花多久,反而是在部署测试上面,耗费不少时间。
本地测试一切正常之后,变将代码部署至服务端,因为服务器使用宝塔,部署过程也很快。
可是问题就出在了,测试过程中。
起初我只是察觉,代理服务端收到请求之后,一直没有将请求转发出去,于是查看请求日志,发现满屏的http 444
。
这个时候,我只是比较困惑,本地发送相同的请求都是正常的,怎么来自客户端的请求就有问题了。
于是,查了一下这个 444 状态码。
它实际上并不是一个标准的 HTTP Status Codes,而是Nginx 自定义的一个Code,通常用于服务端没有返回信息给客户端并且关闭了连接的场景。
服务端的Nginx 为什么会关闭连接?通常由以下两类原因引起:
- 客户端发送恶意的请求
- 客户端发送格式错误的请求
想清楚这两点之后,我对比了一下本地发送的请求,与客户端发送的请求之间的差异:
本地:
1 | curl --location --request POST 'http://xxx.xxx.com/route' \ |
客户端:
1 | curl --location --request POST 'http://xxx.xxx.com/route' \ |
除了User-Agent
不同,其余信息均一致。
为了验证我的猜想,打开宝塔的Nginx 防火墙站点日志,果然,全部被拦截了:
至于为什么UA 中携带了Apache-HttpClient/4.4.1
这几个关键字就被拦截了,可以通过宝塔默认的User-Agent过滤
规则中找到答案:
可以很清晰地看到,关键词过滤规则中,有一个Apache-HttpClient
。
知道原因之后就好办了,将关键词过滤的开关给关了,服务即可正常访问。