代码之家  ›  专栏  ›  技术社区  ›  EsotericVoid

Kong使用regex URI的错误评估顺序

  •  0
  • EsotericVoid  · 技术社区  · 7 年前

    以下是我的香港API:

    {
       "total" : 5,
       "data" : [
          {
             "upstream_read_timeout" : 60000,
             "retries" : 5,
             "strip_uri" : false,
             "upstream_connect_timeout" : 60000,
             "created_at" : 1515179488893,
             "preserve_host" : false,
             "https_only" : false,
             "upstream_send_timeout" : 60000,
             "uris" : [
                "/users/\\d"
             ],
             "id" : "edbc93f2-e897-490f-a0a5-7fb627eb8748",
             "upstream_url" : "http://172.18.0.3:8002",
             "http_if_terminated" : false,
             "name" : "account"
          },
          {
             "upstream_send_timeout" : 60000,
             "id" : "2d76ec3e-df4d-43f1-8bbb-79e613f882a8",
             "uris" : [
                "/\\w"
             ],
             "upstream_url" : "http://172.18.0.3:8002",
             "http_if_terminated" : false,
             "name" : "login",
             "upstream_read_timeout" : 60000,
             "strip_uri" : false,
             "retries" : 5,
             "upstream_connect_timeout" : 60000,
             "created_at" : 1515179488936,
             "https_only" : false,
             "preserve_host" : false
          },
          {
             "name" : "event",
             "upstream_url" : "http://172.18.0.10:8004",
             "http_if_terminated" : false,
             "uris" : [
                "/users/\\d /calendars/\\d /events"
             ],
             "id" : "2f5c90de-dc09-43f3-92d4-7d798b6fd149",
             "upstream_send_timeout" : 60000,
             "preserve_host" : false,
             "https_only" : false,
             "retries" : 5,
             "strip_uri" : false,
             "upstream_connect_timeout" : 60000,
             "created_at" : 1515179488801,
             "upstream_read_timeout" : 60000
          },
          {
             "preserve_host" : false,
             "https_only" : false,
             "created_at" : 1515179488610,
             "retries" : 5,
             "strip_uri" : false,
             "upstream_connect_timeout" : 60000,
             "upstream_read_timeout" : 60000,
             "name" : "instructions",
             "http_if_terminated" : false,
             "upstream_url" : "http://172.18.0.13:8005",
             "uris" : [
                "/users/\\d /calendars/\\d /events/\\d /recurrence/\\d /instruction"
             ],
             "id" : "4e0462ff-3446-4f2a-9a54-d0e6fb385a2c",
             "upstream_send_timeout" : 60000
          },
          {
             "retries" : 5,
             "upstream_connect_timeout" : 60000,
             "strip_uri" : false,
             "created_at" : 1515179488849,
             "preserve_host" : false,
             "https_only" : false,
             "upstream_read_timeout" : 60000,
             "upstream_url" : "http://172.18.0.7:8003",
             "http_if_terminated" : false,
             "name" : "calendar",
             "upstream_send_timeout" : 60000,
             "uris" : [
                "/users/\\d /calendars"
             ],
             "id" : "1e12ba7e-571b-4d02-9e70-a6823db0606d"
          }
       ]
    }
    

    使用以下命令创建:

    # instructions
    curl -i -X POST http://localhost:8001/apis/ \
        -d 'name=instructions' \
            -d 'upstream_url=http://172.18.0.13:8005' \
            -d 'uris=/users/\d+/calendars/\d+/events/\d+/recurrence/\d+/instruction' \
        -d 'strip_uri=false'
    curl -i -X POST http://localhost:8001/apis/instructions/plugins --data "name=jwt"
    # event
    curl -i -X POST http://localhost:8001/apis/ \
        -d 'name=event' \
            -d 'upstream_url=http://172.18.0.10:8004' \
            -d 'uris=/users/\d+/calendars/\d+/events' \
        -d 'strip_uri=false'
    curl -i -X POST http://localhost:8001/apis/event/plugins --data "name=jwt"
    # calendar
    curl -i -X POST http://localhost:8001/apis/ \
        -d 'name=calendar' \
            -d 'upstream_url=http://172.18.0.7:8003' \
            -d 'uris=/users/\d+/calendars' \
        -d 'strip_uri=false'
    curl -i -X POST http://localhost:8001/apis/calendar/plugins --data "name=jwt"
    # account
    curl -i -X POST http://localhost:8001/apis/ \
        -d 'name=account' \
            -d 'upstream_url=http://172.18.0.3:8002' \
            -d 'uris=/users/\d+' \
        -d 'strip_uri=false'
    curl -i -X POST http://localhost:8001/apis/account/plugins --data "name=jwt"
    # login
    curl -i -X POST http://localhost:8001/apis/ \
        -d 'name=login' \
            -d 'upstream_url=http://172.18.0.3:8002' \
            -d 'uris=/\w/' \
        -d 'strip_uri=false'
    

    如果我尝试访问 /users/3/calendars ,我被重定向到 account api(定义为 uris=/users/\d+ ),但我希望被重定向到 calendar api(定义为 uris=/users/\d+/calendars ). 从 docs :

    如前所述,Kong按长度计算前缀URI:首先计算最长的前缀URI。然而 Kong将根据正则表达式URI的定义顺序对其进行评估。

    我做错了什么? 谢谢你的时间。

    1 回复  |  直到 7 年前
        1
  •  1
  •   EsotericVoid    7 年前

    问题在 curl 命令,以便使用 + 在设置URI时的请求中 --data-urlencode 需要使用,而不是 -d