nginx 匹配位置中的特定单词

2024-05-08

我在匹配 nginx $request_body 变量中的特定单词时遇到问题。 如果正文请求中有特殊单词,我想代理传递,

所以我的方法是这样的:

 location ~ \.php$ {
if ($request_body ~* (.*)) {                                        
        proxy_pass http://test.proxy;
            break;
    }

# other case...
}

这匹配所有内容并且 if 语句有效, 但如果我以任何方式改变正则表达式,我就不会受到影响。

所以我现在的问题是:

我需要如何正确定义 nginx 中的正则表达式以匹配“目标”?

提前致谢!


您的代码有很多问题。

  1. “($request_body ~* (.*))”永远不会匹配其他人所说的任何内容,因此“其他情况”始终是结果

  2. 更重要的是,它使用“proxy_pass”和“if”,这在传统上是邪恶的。http://wiki.nginx.org/IfIsEvil http://wiki.nginx.org/IfIsEvil.

要获得您想要的,请使用第 3 方 ngx_lua 模块(v0.3.1rc24 及更高版本)...

location ~ \.php$ { 
    rewrite_by_lua ' 
        ngx.req.read_body() 
        local match = ngx.re.match(ngx.var.request_body, "target") 
        if match then 
            ngx.exec("@proxy");
        else 
            ngx.exec("@other_case");     
        end 
    '; 
} 

location @proxy {    
    # test.proxy stuff 
    ... 
}

location @other_case {
    # other_case stuff 
    ... 
}

你可以在以下位置获取 ngx_luahttps://github.com/chaoslawful/lua-nginx-module/tags https://github.com/chaoslawful/lua-nginx-module/tags.

附言。请记住,lua 的重写总是在 nginx 重写指令之后执行,因此如果您在其他情况下放置任何此类指令,它们将首先执行,您会得到有趣的结果。

您应该将所有重写放在 lua 上下文重写中以获得一致的结果。这就是“其他情况”的“if ..else..end”安排的原因。


您可能需要这个更长的版本


location ~ \.php$ { 
    rewrite_by_lua '
        --request body only available for POST requests
        if ngx.var.request_method == "POST"
            -- Try to read in request body
            ngx.req.read_body()
            -- Try to load request body data to a variable
            local req_body = ngx.req.get_body_data()
            if not req_body then 
                -- If empty, try to get buffered file name
                local req_body_file_name = ngx.req.get_body_file()
                --[[If the file had been buffered, open it, 
                read contents to our variable and close]] 
                if req_body_file_name then
                    file = io.open(req_body_file_name)
                    req_body = file:read("*a")
                    file:close()
                end
            end
            -- If we got request body data, test for our text
            if req_body then
                local match = ngx.re.match(req_body, "target") 
                if match then 
                    -- If we got a match, redirect to @proxy
                    ngx.exec("@proxy")
                else
                     -- If no match, redirect to @other_case
                    ngx.exec("@other_case")
                end
            end
        else
            -- Pass non "POST" requests to @other_case
            ngx.exec("@other_case")
        end
    ';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nginx 匹配位置中的特定单词 的相关文章

  • Java 正则表达式 电子邮件

    首先 我知道不建议使用正则表达式发送电子邮件 但我必须对此进行测试 我有这个正则表达式 b A Z0 9 A Z0 9 A Z 2 4 b 在Java中 我是这样做的 Pattern p Pattern compile b A Z0 9 A
  • 反序列化之前从 JSON 中删除奇怪的隐藏字符

    我有一些 JSON 发送给我 当它尝试反序列化时会中断 它似乎含有一颗黑色钻石 上面有 在里面 我看不到该角色 但它显然在那里 但在我的系统上失败了 如何摆脱这个问题并保持 JSON 完整以进行反序列化 UPDATE 以下是 JSON 中间
  • 自动用 if/else 替换条件运算符?

    特定的 JS 解析器 不在我的控制范围内 不理解嵌套条件运算符语法 如下所示 return num 1 condition condition something something 因此 我想使用 if else 块替换文件中的所有条件运
  • 在 R 中提取模式/分隔符之间的字符串

    我的变量名称格式如下 PP Sample 12 GT or PP Sample 17 GT 我正在尝试使用字符串拆分来 grep 出中间部分 即Sample 12 or Sample 17 但是 当我这样做时 IDtmp lt sapply
  • PHP 正则表达式查找特定的阿拉伯语关键字

    我需要找到一种可靠的方法来使用 PHP 搜索阿拉伯语单词 我要搜索的文本可能是英语或阿拉伯语 因此英语单词不能破坏系统 我一直在阅读 PHP 手册和其他一些材料 并认为我有一个正确的解决方案 但我将感谢一些正则表达式专家的一些意见 这项任务
  • 如何在文件夹中的 xml 文件中 grep 一个单词

    我知道我可以使用 grep 在这样的文件夹中的所有文件中查找单词 grep rn core 但我当前的目录有很多子目录 我只想搜索当前目录及其所有子目录中存在的所有 xml 文件 我怎样才能做到这一点 我试过这个 grep rn core
  • 在 Java/GWT 中解析用户时间输入

    解析用户在 GWT 中的文本字段中键入的时间的最佳方法是什么 默认时间格式要求用户完全按照区域设置指定的时间格式输入时间 我想要更加灵活 因为用户可以通过多种不同的方式输入时间 例如 8 8p 8pm 8 15pm 13 15 1315 1
  • 基于Java模式分割字符串

    您好 我有以下模式的日志文件 2014 03 06 03 21 45 432 ERROR mfs pool 3 thread 19 dispatcher StatusNotification Error processing notific
  • 如果使用 javascript 在 ASP.NET 中页面验证失败,如何禁用提交按钮

    如果页面上的验证失败 我需要使用 JavaScript 禁用表单上的保存按钮 如果没有 则必须使用以下代码启用它 Code
  • nginx 解析器——dns

    请原谅一个非常初学者的问题 我无法理解 nginx 的 解析器 参数及其工作原理 我已阅读文档 搜索教程和帖子 使用解析器 nginx 和 dns 等关键字 但我仍然不确定如何应用解析器 http nginx org en docs htt
  • 只有一组多次捕获

    String 50 60 70 50 1 7 9 51 5 9 10 Want 9 51 Tried G K d Result 1 7 9 51 看来您正在使用 PCRE 正则表达式来获取可以在内部数学运算符前面添加的数字 没有内在的 Us
  • 正则表达式 - 如何从引号之间提取文本并排除引号

    我需要正则表达式方面的帮助 我需要创建一个规则来保留引号之间的所有内容并排除引号 例如 我要这个 STRING ID 0 Stringtext 变成了 Stringtext Thanks 做到这一点的方法是使用捕获组 然而 不同的语言处理捕
  • dataTables fnFilter 列 on img 文件名

    我正在尝试根据标签的 src 属性中的图像文件名来过滤列 我的行看起来像这样 tr class unread odd td class td tr
  • Nginx 作为负载均衡器,具有 75% 和 25% 加权路由

    我是 Nginx 新手 我有两台服务器 serverA 和 serverB 我希望 75 的请求发送到 serverA 其余 25 的请求发送到 serverB 这可能吗 使用nginx加权路由 stream upstream stream
  • 查找和替换正则表达式问题

    感谢这里对我其他问题的所有大力帮助 我开始掌握正则表达式 但我仍然对这个一无所知 我的代码是 StreamReader reader new StreamReader fDialog FileName ToString string con
  • mod_rewrite 将 '_' 替换为 '-'

    我几乎已经有了 mod rewrite 规则 但我已经屈服了 我需要重写 country countryname php to country countryname 但是 国家 地区名称 可能有这样的下划线 south africa ph
  • Python替换多个字符串同时支持反向引用

    有一些好方法 https stackoverflow com questions 6116978 python replace multiple strings处理 python 中的同时多字符串替换 但是 我在创建一个高效的函数来实现这一
  • 如何为所有语言创建字母数字正则表达式?

    我今天遇到了这个问题 此正则表达式仅匹配英语 a zA Z0 9 如果我需要支持这个世界上的任何语言 我应该编写什么正则表达式 如果您使用字符类简写和 Unicode 识别正则表达式引擎 您就可以做到这一点 这 wclass 匹配 单词字符
  • 在 Nginx 中使用查询参数绕过基本身份验证

    在我的 nginx 配置中 我打开了基本身份验证来限制对站点的访问 如下所示 auth basic Restricted Area auth basic user file path to htpasswd 这适用于用户 但我们使用的一些工
  • 使用正则表达式查找除一个字符串之外的所有字符串[重复]

    这个问题在这里已经有答案了 我想匹配除字符串之外的所有字符串 ABC 例子 A gt Match F gt Match AABC gt Match ABCC gt Match CBA gt Match ABC gt No match 我尝试

随机推荐