Openresty ngx.re.find 不能唯一匹配
描述我的问题
系统: debian 8.0 x64
服务端: Openresty 1.13.6.1 默认安装
新手,问得比较简单,望见谅
问题描述:
我需要实现对 request_uri(请求路径) /admin/xxx
进行唯一匹配,所以我选择了 ngx.re.find
语法:
if (ngx.re.find(ngx.var.request_uri, "^/admin/", "jo") ~= nil) then
return ngx.exit(ngx.HTTP_CLOSE)
end
使用这段代码后,我访问 /admin/xxx 路径(其中 xxx 为任意值或为空)会被连接中断而拒绝访问(ngx.HTTP_CLOSE == return 444),这个匹配成功了。
但问题在后面,我访问其它非 /admin/xxx 的路径也会被连接中断,这就表明 ^/admin/
并没有对 /admin/xxx 进行唯一匹配,也还对其它 /xxx/xxx/... 路径进行了匹配。
我的尝试
为了尝试是不是 "^/admin/" 这个正则的错误,我做了以下尝试:
修改正则
我也尝试过把正则写法换成 "^(/admin/)" 或 "^/admin/" 或 "^(/admin/)",第一种写法的结果和上文所述一样(之后还单独做了正则验证,表明 ^/admin/ 和 ^(/admin/) 匹配结果一致,在下文会提到),后两种使用转义符号的写法都返回 500 错误(debug 表明语法错误,无法 load lua 脚本)
验证正则
上面提到我单独做了正则验证,为了进行验证,我将以下代码放进网站:
if (ngx.var.request_uri == "/test1/") then
if (ngx.re.find("/admin/test/", "^/admin/", "jo") ~= nil) then
ngx.say("1=" .. ngx.re.find("/admin/test/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test2/") then
if (ngx.re.find("/admintest/", "^/admin/", "jo") ~= nil) then
ngx.say("2=" .. ngx.re.find("/admintest/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test3/") then
if (ngx.re.find("/artic/", "^/admin/", "jo") ~= nil) then
ngx.say("3=" .. ngx.re.find("/artic/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test4/") then
if (ngx.re.find("/artic", "^/admin/", "jo") ~= nil) then
ngx.say("4=" .. ngx.re.find("/artic", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test5/") then
if (ngx.re.find("/offline/admin/", "^/admin/", "jo") ~= nil) then
ngx.say("5=" .. ngx.re.find("/offline/admin/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test6/") then
if (ngx.re.find("/offline/", "^/admin/", "jo") ~= nil) then
ngx.say("6=" .. ngx.re.find("/offline/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test7/") then
if (ngx.re.find("/admin/", "^/admin/", "jo") ~= nil) then
ngx.say("7=" .. ngx.re.find("/admin/", "^/admin/", "jo"))
end
elseif (ngx.var.request_uri == "/test8/") then
if (ngx.re.find("/adm/in", "^/admin/", "jo") ~= nil) then
ngx.say("8=" .. ngx.re.find("/adm/in", "^/admin/", "jo"))
end
else
if (ngx.var.request_uri == "/test9/") then
if (ngx.re.find("/admin", "^/admin/", "jo") ~= nil) then
ngx.say("9=" .. ngx.re.find("/admin", "^/admin/", "jo"))
end
end
end
然后依次访问对应路径,只有第一个和第七个分别返回 "1=1" 和 "7=1",这却表明我的正则没写错,也将其中 ^/admin/ 换成 ^(/admin/) 试过,结果一致。
确认不是我其它地方的错误
例如也有可能是我其它脚本有什么错误,所以我试着把 ngx.re.find 换成 Lua 的string.find 正则规范:
if (string.find(ngx.var.request_uri, "^/admin/") ~= nil) then
return ngx.exit(ngx.HTTP_CLOSE)
end
然后却发现匹配没有问题了,由此可知确认不是我其它地方的错误。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论