草庐IT

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

waring_id 2023-03-28 原文

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 服务并验 

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 后,传递给后端

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)"

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

有关利用Kong 的 request-transformer 插件重写 URL的更多相关文章

  1. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  2. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  3. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  4. ruby - 如何使用 Ruby aws/s3 Gem 生成安全 URL 以从 s3 下载文件 - 2

    我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A

  5. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  6. ruby-on-rails - 如何生成传递一些自定义参数的 `link_to` URL? - 2

    我正在使用RubyonRails3.0.9,我想生成一个传递一些自定义参数的link_toURL。也就是说,有一个articles_path(www.my_web_site_name.com/articles)我想生成如下内容:link_to'Samplelinktitle',...#HereIshouldimplementthecode#=>'http://www.my_web_site_name.com/articles?param1=value1¶m2=value2&...我如何编写link_to语句“alàRubyonRailsWay”以实现该目的?如果我想通过传递一些

  7. ruby - Rack:如何将 URL 存储为变量? - 2

    我正在编写一个简单的静态Rack应用程序。查看下面的config.ru代码:useRack::Static,:urls=>["/elements","/img","/pages","/users","/css","/js"],:root=>"archive"map'/'dorunProc.new{|env|[200,{'Content-Type'=>'text/html','Cache-Control'=>'public,max-age=6400'},File.open('archive/splash.html',File::RDONLY)]}endmap'/pages/search.

  8. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  9. ruby-on-rails - Rails - 使用/自定义 URL : '/dashboard' 指定根路径 - 2

    如何使此根路径转到:“/dashboard”而不仅仅是http://example.com?root:to=>'dashboard#index',:constraints=>lambda{|req|!req.session[:user_id].blank?} 最佳答案 您可以通过以下方式实现:root:to=>redirect('/dashboard')match'/dashboard',:to=>"dashboard#index",:constraints=>lambda{|req|!req.session[:user_id].b

  10. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

随机推荐