【问题标题】:Most efficient regular expression for Nginx locationNginx 位置最有效的正则表达式
【发布时间】:2014-07-28 04:15:50
【问题描述】:

定义匹配类似

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

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

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

之类的位置指令生成输出
location  / {content_by_lua_file...}

【问题讨论】:

    标签: regex nginx webserver


    【解决方案1】:

    正则表达式的作用非常有效。

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

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

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多