前言
最近需要忽略请求 uri 大小写,即不管 uri 的大小写都返回小写 uri 所请求的响应内容,例如请求 xx.vip/A 实际请求 xx.vip/a, 本文主要以 apisix 来讲解如何实现这个功能。
解决
遇到这个需求,首先肯定采用 apisix 的插件来实现,根据前面多次的经验,这个功能应该可以使用 serverless 插件中的 serverless-pre-function 插件来实现,具体的流程如下:
1 获取请求的 uri 2 将 uri 转为小写 3 修改请求的 uri
具体的插件内容如下:
"serverless-pre-function": {
"_meta": {
"disable": false
},
"functions": [
"return function(conf, ctx) local uri = ctx.var.uri;ctx.var.uri= string.lower(uri);ngx.log(ngx.ERR, \"match uri \", ctx.var.uri ); end" ],
"phase": "rewrite"
}
添加插件后,再次请求路径,发现请求结果还是没有变,查看日志发现 uri 修改成功了,不知为何还是没有修改成功。
后面又仔细研究了 proxy-rewrite 插件中修改 uri 的代码,发现它是使用了 nginx 标准的函数 ngx.req.set_uri
来赋值新的 uri。
修改后的插件代码如下:
"serverless-pre-function": {
"_meta": {
"disable": false
},
"functions": [
"return function(conf, ctx) local uri = ctx.var.uri;uri= string.lower(uri);ngx.req.set_uri(uri);ngx.log(ngx.ERR, \"match uri \", ctx.var.uri ); end"
],
"phase": "rewrite"
}
具体就是请求经过 serverless-pre-function 插件会将 uri 进行重写,并将重写后的 uri 赋值。
小结
本文主要就是讲述如何使用 apisix 插件将请求的 uri 忽略大小写,统一使用小写 uri,可能还有别的方法,等我研究完,再更新文章。