# 499状态码问题

# 问题描述

在一次导流课上线中,有0元支付的场景。在此场景下,不需要调用微信和支付宝的支付接口,服务端判断如果是0元支付,在生成订单后直接调转到支付成功的界面。

支付成功的前端界面是VUE开发的,可以通过路由直接访问。

测试环境没有任何问题,但是在一次上线后 pay-success(https://weixin.eiduo.com/pay-success) 无法访问,界面打不开,其余一切正常。

# 排查过程

  1. 先从部署开始入手,是否是前端代码没有发到生产环境。 删除构建系统的项目目录,重新构建、发布上线,结果问题依然存在。
  2. 检查代码是否存在问题,结果并未发现任何问题。
  3. 检查域名配置,未发现问题。
  4. 也是最后一招,查看nginx访问日志,检查请求是否经过Nginx。
tail -5500f /mnt/data/nginx/logs/access.log |grep 'pay-success'
1

浏览器进行请求,结果发现下面2条记录

58.220.50.36 - - [09/Jan/2021:13:36:07 +0800] "GET /pay-success HTTP/1.1" 499 0 "-" "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36" "183.160.214.75" "101.226.26.229:80" - "-"
123.156.198.149 - - [09/Jan/2021:13:37:13 +0800] "GET /pay-success HTTP/1.1" 499 0 "-" "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36" "183.160.214.75" "101.226.26.226:80" - "-"
1
2

可以发现HTTP状态码是 499,瞬间感觉发现新大陆,因为从来没见过这个code。

# 什么是 Nginx 499 错误?

Nginx 源码中对 499 状态码的定义:

/*
 * HTTP does not define the code for the case when a client closed
 * the connection while we are processing its request so we introduce
 * own code to log such situation when a client has closed the connection
 * before we even try to send the HTTP header to it
 */
#define NGX_HTTP_CLIENT_CLOSED_REQUEST     499
1
2
3
4
5
6
7

翻译成人话就是:

当客户端连接关闭的时候,HTTP没有定义这样一种code。处理这样的请求(在尝试发送HTTP请求头之前客户端关闭连接)时,我们自己定义了一个自己的code来记录。

进一步理解就是:

我特么也不知道也不知道这种情况怎么搞,于是自定义一个状态码记录一下,该怎么处理,自己看着办!

# 解决

通过 baidu and google,找到Nginx的一个配置:proxy_ignore_client_abort = ON,查询 Nginx 官方文档,解释如下:

Determines whether the connection with a proxied server should be closed when a client closes the connection without waiting for a response.

翻译成人话就是:

确定当客户端关闭连接而不等待响应时是否关闭与代理服务器的连接。

更新时间: 2021-05-05 20:24:13