博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一种轻量的openresty路由设计
阅读量:4593 次
发布时间:2019-06-09

本文共 2622 字,大约阅读时间需要 8 分钟。

在使用openresty开发接口的过程会发现一个问题,那就是接口的地址问题怎么解决,最好一个接口地址对应一个lua文件,也可以在nginx.conf 配置中使用content_by_lua 来编写接口逻辑,显然后者并不合适团队开发,为了解决这个问题,所以出现了很多类似的框架,一个比较好用的就是lusty框架,他可以将url中的某段值自动定义成变量,但是耦合性有点高,当多个接口站点部署在同一个nginx上时,你只能通过修改lusty的目录结构和app.lua文件,显然这不是我想要的结果,在网上找到一段很犀利的ngx配置,简单粗暴,但非常有效。

 

但出于安全性考虑,决定给访问的接口地址加个白名单功能,不在白名单的地址不允许访问。

将白名单功能抽象成一个app_route.lua文件,在初始化的时候需要载入一个白名单列表,具体的ngx配置如下:

这里加载了一个对应目录的route_config.lua,由于这个config文件内容较小,所以我把内容直接列了出来:

--白名单列表local whitelist = {    'test1',    'user/login',    'user/register'}--路由重写列表local rewritelist = {    ['user/([-_a-zA-Z0-9]+)/login'] = 'user/login',    ['user/([a-zA-Z0-9]+)/register'] = 'user/register'}return {    whitelist = whitelist,    rewritelist = rewritelist}

然后在content_by_lua_file 前面加这么一句代码:

你会发现白名单功能就这么完成了,而且多次测试后发现单纯的路由查找功能会比lusty快一倍以上。

当然也支持简单的路由重定向功能,本文只是单纯的技术分享,如果你有更好的建议也可以单独讨论。

文本是原创作品,转载记得写明出处

app_route.lua

1 local _M = { _VERSION = '0.1' } 2 local mt = { __index = _M} 3 local tinsert = table.insert 4 local tconcat = table.concat 5 local tonumber = tonumber 6 local function uritoken(uri) 7     local ret = {} 8     for token in uri:gmatch("[^/.]+") do 9         tinsert(ret,token)10     end11     return ret12 end13 14 function _M.new(self,rconfig)15     local tab = {}16     local routeMap = require(rconfig)17     local route_data = {}18     local whitelist = routeMap.whitelist19     for i=1,#whitelist do20         local ret = uritoken(whitelist[i])21         if #ret > 0 then22             tinsert(route_data,tconcat({
'^',tconcat(ret,'/'),'$'}))23 end24 end25 local rewritelist = routeMap.rewritelist26 local x = 127 local rewrite_data = {}28 local rewrite_urls = {}29 for k,v in pairs(rewritelist) do30 tinsert(rewrite_data,tconcat({
'^(?
',k,')$'}))31 tinsert(rewrite_urls,v)32 x = x + 133 end34 tab.rewrite_urls = rewrite_urls35 tab.rewrite_pattern = tconcat(rewrite_data,'|')36 tab.route_pattern = tconcat(route_data,'|')37 return setmetatable(tab, mt)38 end39 40 function _M.route_verify(self)41 local uri = ngx.var.api_path42 local ret = uritoken(uri)43 uri = tconcat(ret,'/')44 ngx.var.api_path = uri45 local m = ngx.re.match(uri,self.route_pattern)46 if m == nil then47 m = ngx.re.match(uri,self.rewrite_pattern)48 if m == nil then49 ngx.exit(404)50 else51 local locant = ngx.re.match(next(m,#m), "^z(\\d+)z")52 ngx.var.api_path = self.rewrite_urls[tonumber(locant[1])]53 end54 end55 end56 return _M

 

转载于:https://www.cnblogs.com/sixclub/p/4762828.html

你可能感兴趣的文章
巨蟒python全栈开发-第11阶段 ansible_project7
查看>>
面试题:实现LRUCache::Least Recently Used的缩写,意思是最近最少使用,它是一种Cache替换算法...
查看>>
Android系统刷机成功后网络信号显示“无服务”修正
查看>>
深圳Uber优步司机奖励政策(12月28日到1月3日)
查看>>
文本框样式大全
查看>>
shell按行合并文件
查看>>
leetcode总结
查看>>
[BZOJ 1095] [ZJOI 2007]Hide 捉迷藏
查看>>
分层测试_基本思想
查看>>
HihoCoder - 1139
查看>>
Entity Framework:如果允许模型处于非法状态,在某些场景下,记得清空DbContext
查看>>
初次使用Mybatis配置出现错误待解决
查看>>
linux中使用vi 打开文件时,能显示行号
查看>>
java性能调优实战
查看>>
larabel Artisan Command 使用总结
查看>>
mysql中查看一个字段中,有几个逗号
查看>>
C#中的常识
查看>>
安装SQL Server 2012 『企业中文版』
查看>>
win10 上安装虚拟机
查看>>
Mysql 数据迁移后 启动出错
查看>>