1. 前言
最近项目中使用了网关Kong,在部署服务和路由的过程中,遇到了部分请求返回的结果是html页面,通过js 发送ajax请求时,如果被代理的服务没有配置可跨域请求,会出现无法通过js配合请求头Host 请求的问题。
在后续研究Kong官方文档的过程中,发现,在添加路由时可通过 请求头 、 请求路径 等方式路由。
2 路由配置
2.1 请求头路由
通过Host请求头路由是Kong 代理 流量的最直接方式,而且 这是Http Host 标头的预期用途。
通过Admin API 添加路由时,hosts可接收多个值:
curl -i -X POST http://localhost:8001/routes/ \
-H 'Content-Type: application/json' \
-d '{"hosts":["example.com", "foo-service.com"]}'
HTTP/1.1 201 Created
...
客户端的 请求头 包含 Host: example.com 或者 Host: foo-service.com 都将通过此路由访问具体服务。
2.2 其他请求头路由
从 1.3 开始,Kong 支持通过任意 HTTP 标头进行路由,通过在请求头中添加自定义 标头 做路由。
添加自定义 请求头方式:
curl -i -X POST \
--url http://kong:8001/services/{serviceId}/routes \
--data "name=kong.route.client" \
--data "headers.client=kong" \
--data 'paths=/client'
添加成功后,来自客户端的请求 标头包含有 Client:Kong 的将通过 kong.route.client 路由到具体的服务上
2.3 访问路径路由
kong 路由匹配的另一种方式是通过请求路径。通过Admin API 添加路由时,要实现通过请求路径路由的功能,在添加时,不能添加Host 请求标头.
添加方式:
curl -i -X POST \
--url http://kong:18001/services/{servcieId}/routes \
--data "name=kong.route.path" \
--data 'paths=/kong' \
--data 'strip_path=false'
如上配置,来自客户端的请求 以 /kong/*** 开头的路径 将会通过此路有访问具体服务。
strip_path 参数说明:
strip_path 使用 Boolean 属性的值,
设置成ture 时,会在匹配到客户端的请求后,配置的前缀 信息将不包含在上游的请求中。既如上所配置,strip_path=true 时,来自客户端的访问 /kong/services/list 转发到上游服务时将会是 /service/list 。路由配置 路径 /kong 前缀将不包含在 上游的请求中。
通过路径路由,可解决 部分客户端请求无法添加 host 标头的方式。