多项目 路由缓存bug重现
发现vanilla的restful路由存在bug。下面是配置和重现步骤。
注意:web1和web2的的配置 只有 config目录下面 restful.lua 和 controller 下面的 index.lua 不同。其他都一样。下面是配置。
web2 的 restful.lua 比 web1的 restful.lua 多了 匹配详细内容的条件
{pattern = '/:category/:id\\.html', controller = 'index', action = 'detail'}
环境如下
系统:centos6.5 64位
vanilla 版本 :V0.1.0-rc6.1
项目1: /home/webserver/web1 绑定域名 www.web1.com
项目2:/home/webserver/web2 绑定域名 www.web2.com
下面开始配置:
web1 配置
一、bootstrap 配置
web1\application\bootstrap.lua
设置如下
function Bootstrap:initRoute()
local router = self.dispatcher:getRouter()
local restful_route = restful:new(self.dispatcher:getRequest())
router:addRoute(restful_route, true)
end
二、restful.lua 配置
启用 restful路由,然后修改 web1\config\restful.lua
如下:
local restful = {
v={}
}
restful.v.GET = {
{pattern = '/', controller = 'index', action = 'index'},
{pattern = '/:category', controller = 'index', action = 'list'}
}
return restful
三、controllers 配置
修改 默认 index.lua 为如下代码
local IndexController = {}
function IndexController:index()
ngx.say('this is web1 index')
return ''
end
function IndexController:list()
ngx.say('this is web1 list')
return ''
end
return IndexController
web2 配置
一、bootstrap 配置
web2\application\bootstrap.lua
设置如下
function Bootstrap:initRoute()
local router = self.dispatcher:getRouter()
local restful_route = restful:new(self.dispatcher:getRequest())
router:addRoute(restful_route, true)
end
二、restful.lua 配置
启用 restful路由,然后修改 web2\config\restful.lua
如下:
local restful = {
v={}
}
restful.v.GET = {
{pattern = '/', controller = 'index', action = 'index'},
{pattern = '/:category', controller = 'index', action = 'list'},
{pattern = '/:category/:id\\.html', controller = 'index', action = 'detail'}
}
return restful
三、controllers 配置
修改 默认 index.lua 为如下代码
local IndexController = {}
function IndexController:index()
ngx.say('this is web2 index')
return ''
end
function IndexController:list()
ngx.say('this is web2 list')
return ''
end
function IndexController:detail()
ngx.say('this is web2 detail')
return ''
end
return IndexController
开启重现bug:
切换到 web1 项目 /home/webserver/web1,然后 启动项目 ./va-web1-service start
注意是 项目1 启动
然后访问web1:
www.web1.com/ ,没问题
www.web1.com/list ,没问题
然后 访问web2
www.web2.com/ ,没问题
www.web2.com/list ,没问题
www.web2.com/list/123.html 报错了 提示路由不匹配 1Routes All Didn't Match. Errs Like:
注意是 项目2 启动
切换到项目2 /home/webserver/web2
。在启动 ./va-web2-service start
然后访问web1:
www.web1.com/ ,没问题
www.web1.com/list ,没问题
然后 访问web2
www.web2.com/ ,没问题
www.web2.com/list ,没问题
www.web2.com/list/123.html 没问题
猜想。bug 大概是因为 路由缓存引起的,当项目1和项目2的 restful 规则一样时候,哪个项目启动都没问题 。当 restful 规则 不一样的时候。哪个项目启动。就按那个项目 restful 规则 解析 所有项目。 所以 除 启动的那个项目没问题。其他项 目 访问 路由 都会 提示 :提示路由不匹配 1Routes All Didn't Match. Errs Like: