跳到主要内容

client-control

client-control 插件可为路由或服务设置请求体大小限制。它允许单个 API 使用不同于网关全局 NGINX 配置的限制,并在超限请求到达上游服务前拒绝请求。

请求处理与产品兼容性​

请求声明了 Content-Length 时,如果声明的大小超过配置的非零限制,插件会立即以 413 Request Entity Too Large 拒绝请求。对于长度未知的请求,网关会在 NGINX 读取请求体时继续执行该限制。

该插件可用于 APISIX 和 API7 Enterprise。当前维护版本对 gRPC 上游的处理存在以下差异:

产品HTTP 请求发往 gRPC 上游的请求
APISIX 3.19.0执行配置的限制。执行初始的声明长度检查,但在内部重定向后不会重新应用运行时限制。在此版本中,不要依赖该插件控制 gRPC 请求体大小。
APISIX 3.20.0执行配置的限制。在内部 gRPC 重定向后重新应用限制,包括请求未声明 Content-Length 的情况。
API7 Enterprise 3.9.23 和 3.10.10执行配置的限制。执行初始的声明长度检查,但在内部重定向后不会重新应用运行时限制。在这些版本中,不要依赖该插件控制 gRPC 请求体大小。

示例​

在路由上设置 1 KiB 限制,然后发送小于和大于限制的请求,验证网关会拒绝超限请求体。

限制请求体大小​

创建启用 client-control 插件的路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${ADMIN_API_KEY}" \
-d '{
"id": "client-control-route",
"uri": "/anything",
"plugins": {
"client-control": {
"max_body_size": 1024
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

发送一个未超过限制的小请求:

curl -i "http://127.0.0.1:9080/anything" \
-H "Content-Type: application/json" \
-d '{"message":"ok"}'

请求应到达上游,并返回 HTTP 2xx 响应。

发送 2 KiB 的请求体:

head -c 2048 /dev/zero | \
curl -i "http://127.0.0.1:9080/anything" \
-H "Content-Type: application/octet-stream" \
--data-binary @-

网关应以 413 Request Entity Too Large 拒绝该请求。