Skip to main content
Version: Next

ua-restriction

描述#

ua-restriction 插件支持通过配置用户代理的允许列表或拒绝列表来限制对上游资源的访问。一个常见的用例是防止网络爬虫使上游资源过载并导致服务降级。

属性#

名称类型必选项默认值有效值描述
byp​​ass_missingbooleanfalse如果为 true,则在缺少 User-Agent 标头时绕过用户代理限制检查。
allowlistarray[string]要允许的用户代理列表。支持正则表达式。应配置 allowlistdenylist 中至少一个,但不能同时配置。
denylistarray[string]要拒绝的用户代理列表。支持正则表达式。应配置 allowlistdenylist 中至少一个,但不能同时配置。
messagestring"Not allowed"拒绝用户代理访问时返回的消息。

示例#

以下示例演示了如何针对不同场景配置 ua-restriction

note

您可以这样从 config.yaml 中获取 admin_key 并存入环境变量:

admin_key=$(yq '.deployment.admin.admin_key[0].key' conf/config.yaml | sed 's/"//g')

拒绝网络爬虫并自定义错误消息#

以下示例演示了如何配置插件以抵御不需要的网络爬虫并自定义拒绝消息。

创建路由并配置插件以使用自定义消息阻止特定爬虫访问资源:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "ua-restriction-route",
"uri": "/anything",
"plugins": {
"ua-restriction": {
"bypass_missing": false,
"denylist": [
"(Baiduspider)/(\\d+)\\.(\\d+)",
"bad-bot-1"
],
"message": "Access denied"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

向路由发送请求:

curl -i "http://127.0.0.1:9080/anything"

您应该收到 HTTP/1.1 200 OK 响应。

使用不允许的用户代理向路由发送另一个请求:

curl -i "http://127.0.0.1:9080/anything" -H 'User-Agent: Baiduspider/5.0'

您应该收到 HTTP/1.1 403 Forbidden 响应,其中包含以下消息:

{"message":"Access denied"}

绕过 UA 限制检查#

以下示例说明如何配置插件以允许特定用户代理的请求绕过 UA 限制。

创建如下路由:

curl "http://127.0.0.1:9180/apisix/admin/routes" -X PUT \
-H "X-API-KEY: ${admin_key}" \
-d '{
"id": "ua-restriction-route",
"uri": "/anything",
"plugins": {
"ua-restriction": {
"bypass_missing": true,
"allowlist": [
"good-bot-1"
],
"message": "Access denied"
}
},
"upstream": {
"type": "roundrobin",
"nodes": {
"httpbin.org:80": 1
}
}
}'

向路由发送一个请求而不修改用户代理:

curl -i "http://127.0.0.1:9080/anything"

您应该收到一个 HTTP/1.1 403 Forbidden 响应,其中包含以下消息:

{"message":"Access denied"}

向路由发送另一个请求,用户代理为空:

curl -i "http://127.0.0.1:9080/anything" -H 'User-Agent: '

您应该收到一个 HTTP/1.1 200 OK 响应。