Openresty ngx.re.find 不能唯一匹配

发布于 2022-09-07 00:10:55 字数 3004 浏览 22 评论 0

描述我的问题

系统: 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文