天天看點

利用Kong 的 request-transformer 插件重寫 URL

1.背景介紹

需求是将 URL:www.abc.com/api/item/111 重寫成 www.xyz.com/open/item/itemdetail?id=111。且域名不變,不能發生302跳轉。

2.request-transformer

request-transformer 是 Kong 官方的插件,允許修改重寫使用者的請求,還可以使用正規表達式比對 URL 并将比對到的字元串儲存在變量中,然後使用模闆将變量轉換成使用者的請求。

簡而言之就是重寫使用者的請求,包括 URL,args,headers,methods 等等。

github項目位址:​​ request-transformer github​​

3.配置方法

kong 版本為2.2,konga 版本為0.14.9

3.1需求一

将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 的 request-transformer 插件重寫 URL
利用Kong 的 request-transformer 插件重寫 URL

三:最後重新開機 kong 服務并驗 

curl -X GET https://www.myj.com.cn/v4/jkf/branch/qrcode\&code\=100006      

3.2需求二

将/api/item/111 重寫為/open/item/itemdetail?id=111

将URL後面的數字拼接到 id 的值,作為參數拼接成 URL 後,傳遞給後端

#該PATH隻比對/api/item/數字格式的 URL,并且将\d+正則比對到的數字儲存為變量 id
/api/item/(?<id>\d+)$      
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)"      

4.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;
    }
}      

繼續閱讀