中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

apisix~fault-injection條件式(shi)異常響應(ying)

這個插件就是做(zuo)異常返回的事的,不要使用traffic-split來做(zuo)這種事

  • 可以根據請求頭,查詢參數,來動態響應一個異常信息

核心參數

  • abort.vars 執行故障注入的規則,當規則匹配通過后才會執行故障注。vars 是一個表達式的列表,來自 lua-resty-expr。

注意:

  • 從原碼中可以看到,fault-injection插件的優先級非常高,是11000,所以,當你使用這個插件時,如果發現配置未生效,可以修改在使用時重新配置它的優先級即可。
  • fault-injection插件中的vars條件可能依賴于其它插件處理的結果,所以需要降低fault-injection的優先級。

實例如下

  • 請求參數中name為jack的,直接返回403
  • 請求頭中,age為18的,直接返回403
 "fault-injection": {
   "_meta": {
        "disable": false,
        "priority": 1
      },
    "abort": {
        "http_status": 403,
        "body": "Fault Injection!\n",
        "vars": [
            [
                [ "arg_name","==","jack" ]
            ]
        ]
    },
    "delay": {
        "duration": 2,
        "vars": [
            [
                [ "http_age","==","18" ]
            ]
        ]
    }
 }
        

lua-resty-expr 語法介紹

lua-resty-expr 是(shi) OpenResty 中的(de)一個庫,用于構建復雜的(de)條件表達式(shi),常用于流量路由、訪問控制等場景。它(ta)提供(gong)了一種(zhong)聲明式(shi)的(de) DSL 來描述(shu)條件邏輯。

基本語法結構

lua-resty-expr 的基本表達式是一個 Lua 表(table),由(you)操作符和操作數組成:

local expr = require "resty.expr"
local ex = expr.new({
    {op, var, val},
    {op, var, val},
    -- 更多條件...
})

操作符 (op)

支持的操作符包括:

  • 比較操作符:

    • "==":等于
    • "~=":不等于
    • ">":大于
    • ">=":大于等于
    • "<":小于
    • "<=":小于等于
    • "in":包含于
    • "not in":不包含于
  • 邏輯操作符:

    • "and":邏輯與
    • "or":邏輯或
    • "not":邏輯非
  • 其他操作符:

    • "starts_with":以...開頭
    • "ends_with":以...結尾
    • "contains":包含
    • "matches":正則匹配

變量 (var)

變量可以是:

  1. 預定義的變量:

    • "arg_name":請求參數
    • "http_header_name":HTTP 頭
    • "cookie_name":Cookie
    • "var_name":Nginx 變量
  2. 嵌套變量訪問:

    • "arg.user.name":訪問嵌套參數

值 (val)

值可以是:

  • 字符串
  • 數字
  • 布爾值
  • 表(用于 in 操作)
  • 正則表達式(用于 matches 操作)

示例

簡單比較

local ex = expr.new({
    {"==", "arg_foo", "bar"},  -- GET 參數 foo 等于 "bar"
    {"==", "http_x_api_key", "12345"},  -- X-API-Key 頭等于 "12345"
})

邏輯組合

local ex = expr.new({
    {"and", 
        {{"==", "arg_debug", "true"}},
        {{"==", "http_user_agent", "test_client"}}
    }
})

復雜條件

local ex = expr.new({
    {"or",
        {
            {"and",
                {{">=", "arg_age", 18}},
                {{"==", "arg_country", "US"}}
            }
        },
        {
            {"in", "arg_role", {"admin", "superuser"}}
        }
    }
})

字符串操作

local ex = expr.new({
    {"starts_with", "http_user_agent", "Mozilla/"},
    {"matches", "arg_email", [[^[^@]+@[^@]+\.[^@]+$]]}  -- 簡單郵箱格式驗證
})

使用表達式

創建表達式對象(xiang)后,可以這(zhe)樣使用:

local ok, err = ex:  -- 通常在 OpenResty 上下文中使用
if ok then
    -- 條件滿足
else
    -- 條件不滿足
end

注意事項

  1. 表達式在內部會被編譯為高效的 Lua 代碼
  2. 支持短路求值(short-circuit evaluation)
  3. 變量名中的 - 會被替換為 _(例如 http_x_forwarded_for

lua-resty-expr 提(ti)供了一種靈活(huo)而強大的(de)方式來(lai)描述(shu)復雜條件(jian)邏輯,特別適合在 OpenResty 的(de)上(shang)下(xia)文中進行(xing)流(liu)量(liang)控(kong)制和(he)路由決策。

posted @ 2025-07-04 13:06  張占嶺  閱讀(45)  評論(0)    收藏  舉報