Kong作为API网关时PUT、DELETE方法请求无匹配路由问题咨询
问题根因
- 前缀匹配范围过大导致路由匹配逻辑提前终止
Kong默认对路径做前缀匹配,你第一个路由Host.Data的路径配置为/v1/myhost/data,所有以/v1/myhost/data开头的请求都会先命中这个路由的路径匹配规则。而这个路由仅允许GET、POST方法,当PUT/DELETE请求进来时,路径匹配到该路由但方法不被允许,Kong会直接返回无匹配路由的报错,不会继续向后匹配更长路径的Host.DataById路由。 - 动态ID场景路径配置错误
如果你的PUT/DELETE请求是针对带动态ID的资源路径(比如/v1/myhost/data/123),那第二个路由写死的/v1/myhost/data/any路径无法匹配动态ID的请求,也会导致匹配失败。 - 配置缩进错误导致路由未加载
你给出的YAML配置中url字段的缩进比上层name字段多了2个空格,不符合YAML语法规范,可能导致第二个路由配置根本没有被正确加载到Kong中。
解决方案
根据你的实际使用场景选择对应修改方案:
场景1:需要匹配带任意动态ID的单资源路径(如/v1/myhost/data/{id})
修改路由路径配置,将第一个路由设为严格匹配,第二个路由用正则匹配动态ID路径,修复缩进问题后的配置示例如下:
service: - name: Host.Data url: http://myhost.com/data routes: - name: Host.Data methods: - GET - POST paths: - /v1/myhost/data$ # 加$后缀表示严格匹配,仅匹配路径完全等于该值的请求 - name: Host.DataById url: http://myhost.com/data/any routes: - name: Host.DataById methods: - GET - PUT - DELETE paths: - ~/v1/myhost/data/[^/]+$ # ~开头表示正则匹配,匹配所有带单个ID的单资源路径
场景2:仅需要匹配/v1/myhost/data/any固定路径
仅修复第一个路由的匹配规则和配置缩进即可:
service: - name: Host.Data url: http://myhost.com/data routes: - name: Host.Data methods: - GET - POST paths: - /v1/myhost/data$ # 严格匹配,不会匹配/v1/myhost/data/开头的子路径 - name: Host.DataById url: http://myhost.com/data/any routes: - name: Host.DataById methods: - GET - PUT - DELETE paths: - /v1/myhost/data/any
配置修改完成后重载Kong配置,即可正常处理PUT、DELETE请求。
内容的提问来源于stack exchange,提问作者Showren Chowdhury
相关产品推荐
相关产品推荐

