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

时间:2013-10-23 20:07:56

标签: regex nginx webserver

定义匹配类似

之类的位置指令的最有效方法是什么
location = /[0-9a-zA-Z_-]{1,6} { content_by_lua_file ....}

换句话说,一个URI匹配1到6个字符的字符串,带有“ - ”,“_”,数字和字母。

或者检查我的LUA代码中的字符串长度是否更快,这将使用像

这样的位置指令生成输出
location  / {content_by_lua_file...}

2 个答案:

答案 0 :(得分:9)

正则表达式非常有效。

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

通常,a string from 1 to 6 characters with "-", "_", digits and letters的正则表达式可以写为

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

那是因为

  • ^锚点断言我们位于字符串的开头
  • \w字符与字母,数字和下划线字符匹配
  • $锚点断言我们位于字符串的末尾

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

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

对于好奇的另外一小部分信息:在Lua本身,上面的正则表达式可以变成Lua模式,其中使用%代替\来形成元字符:

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

<强>参考

答案 1 :(得分:1)

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