Nginx位置的最有效的正则expression式

什么是最有效的方式来定义一个匹配类似的位置指令

location = /[0-9a-zA-Z_-]{1,6} { content_by_lua_file ....} 

换句话说,一个URI匹配1到6个字符的string,用“ – ”,“_”,数字和字母。

或者在我的LUA代码中检查string长度会更快,这将通过使用位置指令来生成输出

 location / {content_by_lua_file...} 

正则表达式对于他们的工作非常有效。

当任务是微不足道的(例如检查是否存在一个特定的字符串),字符串函数可以比正则表达式快 – 取决于平台。 在这里,你正在检查一个字符的范围和长度。 Lua代码(运行时编译)不太可能比Nginx使用的PCRE regex库的预编译C代码更快。

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

 ^[-\w]{1,6}$ 

那是因为

  • ^锚主张我们在字符串的开头
  • \w单词字符匹配字母,数字和下划线字符
  • $ anchor声明我们在字符串的末尾

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

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

还有一些有趣的信息:在Lua本身,上面的正则表达式可以变成一个Lua模式,其中%被用来代替\形成元字符:

 ^[-%w]{1,6}$ 

参考

  • ngx_http_rewrite_module
  • Lua模式

我认为在Lua中你不但要检查长度,还要检查字符串的内容。
Nginx使用C库PCRE作为正则表达式。
也有JRE编译正则表达式的PCRE-JIT,如果正则表达式比你的问题中的正则表达式更复杂的话,那么这个特别有用。 我认为在Nginx中速度更快。