Nginx位置最有效的正则表达式

use*_*908 8 regex webserver nginx

定义匹配类似的位置指令的最有效方法是什么?

location = /[0-9a-zA-Z_-]{1,6} { content_by_lua_file ....}
Run Code Online (Sandbox Code Playgroud)

换句话说,URI匹配1到6个字符的字符串,带有" - ","_",数字和字母.

或者在我的LUA代码中检查字符串长度是否更快,这将通过使用类似的位置指令生成输出

location  / {content_by_lua_file...}
Run Code Online (Sandbox Code Playgroud)

zx8*_*x81 9

正则表达式非常有效.

当任务很简单时(例如检查特定字符串的存在),字符串函数可能比正则表达式更快 - 取决于平台.在这里,您要检查字符范围和长度.Lua代码(在运行时编译)不太可能比nginx使用的PCRE正则表达式库的预编译C代码更快.

一般来说,正则表达式a string from 1 to 6 characters with "-", "_", digits and letters可以写成

^[-\w]{1,6}$
Run Code Online (Sandbox Code Playgroud)

那是因为

  • 该^锚断言,我们是在字符串的开头
  • 该\w字字符匹配字母,数字和下划线
  • 该$锚断言,我们是在字符串的结束

但是,在nginx中,~(request starts with)运算符允许我们删除开始锚点^.你会写这样的东西:

location ~ [-\w]{1,6}$ {
    # some rewrite code, for example
    # rewrite ^([^/]+)/?$ /oldsite/$1 break;
}
Run Code Online (Sandbox Code Playgroud)

对于好奇的信息还有一点:在Lua本身,上面的正则表达式可以变成一个Lua模式,%用来代替\形成元字符:

^[-%w]{1,6}$
Run Code Online (Sandbox Code Playgroud)

参考


Rhi*_*him 1

我认为在Lua中你不仅要检查字符串的长度,还要检查字符串的内容。
Nginx 使用 C 库 PCRE 来处理正则表达式。
还有 PCRE-JIT,它可以 JIT 编译正则表达式,如果正则表达式比您问题中的正则表达式更复杂,则特别有用。我认为 Nginx 更快。