版本比较
标识
- 该行被添加。
- 该行被删除。
- 格式已经改变。
背景介绍
需求是将 URL:www.abc.com/api/item/111 重写成 www.xyz.com/open/item/itemdetail?id=111。且域名不变,不能发生302跳转。
request-transformer
request-transformer 是 Kong 官方的插件,允许修改重写用户的请求,还可以使用正则表达式匹配 URL 并将匹配到的字符串保存在变量中,然后使用模板将变量转换成用户的请求。
简而言之就是重写用户的请求,包括 URL,args,headers,methods 等等。
github项目地址: request-transformer github
配置方法
kong 版本为2.2,konga 版本为0.14.9
需求一
将URL:/v4/jkf/branch/qrcode&code=100006 重写为 /v4/jkf/branch/qrcode?code=100006。也就是将&转换为?
一、首先配置 Service 和 Route。具体配置方法参考1204-使用Kong和Konga管理微服务和API。主要关心 Route 中的 Path 设置。
代码块 | ||
---|---|---|
| ||
/v4/jkf/branch/qrcode\&code=(?<code>\d+) |
该PATH表示:
- 匹配 /v4/jkf/branch/qrcode&code=任意长度数字
- 正则\d表示匹配数字,并且将匹配到的数字保存为code变量
- \&表示转义 URL 中的$符号
关闭 route 中的 script path 可选项
二、在该 route 下添加 request-transformer 插件,表示该插件只应用到此条 route 。并且配置插件参数
代码块 | ||
---|---|---|
| ||
curl -X POST http://localhost:8001/routes/21292565-e7ae-40ff-a465-f449c16b7819/plugins \ --data "name=request-transformer" \ --data "config.replace.uri=/jkf/branch/qrcode" \ --data "config.add.querystring=code:\$(uri_captures.code)" |
对于上面的命令行解释如下:
- 21292565-e7ae-40ff-a465-f449c16b7819就是刚才创建的路由 ID
- config.replace.uri 表示将 route 匹配到的 PATH 重写为/jkf/branch/qrcode
- onfig.add.querystring 表示给 URL 添加 args 参数
- code:\$(uri_captures.code) 参数名是 code,uri_captures.code 表示获取 route 的 PATH 中 code 变量的值,由于命令行 shell 环境关系,所以要在变量符号$前进行转义。
Konga 的操作如下:
三:最后重启 kong 服务并验
代码块 | ||
---|---|---|
| ||
curl -X GET https://www.myj.com.cn/v4/jkf/branch/qrcode\&code\=100006 |
需求二
将/api/item/111 重写为/open/item/itemdetail?id=111
将URL后面的数字拼接到 id 的值,作为参数拼接成 URL 后,传递给后端
1、添加 Service 和 Routes,Routes 的 PATH 部分如下:
代码块 | ||
---|---|---|
| ||
#该PATH只匹配/api/item/数字格式的 URL,并且将\d+正则匹配到的数字保存为变量 id /api/item/(?<id>\d+)$ |
2、添加和配置插件
代码块 | ||
---|---|---|
| ||
curl -X POST http://localhost:8001/routes/38fce1b7-2a36-42cb-9619-f30539889137/plugins \ --data "name=request-transformer" \ --data "config.replace.uri=/open/item/itemdetail" \ --data "config.add.querystring=id:\$(uri_captures.id)" |
rewrite 参考配置
代码块 | ||
---|---|---|
| ||
server { listen 80 default_server; listen [::]:80 default_server; root /var/www/html; # Add index.php to the list if you are using PHP index index.html index.htm index.nginx-debian.html; server_name _; location / { try_files $uri $uri/ =404; } resolver 119.29.29.29; set $upstream_baidu http://www.baidu.com; location /baidu { rewrite ^/baidu(.*) /$1 break; proxy_pass $upstream_baidu; } set $upstream_bing http://www.bing.com; location /bing { rewrite ^/bing(.*) /$1 break; proxy_pass $upstream_bing; } } |
目录 | ||
---|---|---|
|