8

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

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

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

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

location  / {content_by_lua_file...}
4

2 回答 2

10

正则表达式在他们所做的事情上非常有效。

当任务很简单时(例如检查特定字符串的存在),字符串函数可能比正则表达式更快——取决于平台。在这里,您正在检查字符范围和长度。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}$

参考

于 2014-07-25T23:09:56.807 回答
1

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

于 2014-07-25T22:51:43.803 回答