Openresty nginx ищет ключевое слово в данных тела почтового запроса

Я использую openresty nginx для простой переадресации запросов, он работает, как и ожидалось, я перенаправляю каждый входящий запрос на другой URL-адрес, используя приведенный ниже код:

        location /app/ {
        proxy_pass      https://example.com/abc/;
        proxy_read_timeout 60s;         
        proxy_pass_header Server;
        proxy_set_header          Host            $host;
        proxy_set_header          X-Real-IP       $remote_addr;
        proxy_set_header          X-Forwarded-For $proxy_add_x_forwarded_for;
        add_header  X-Frame-Options "SAMEORIGIN" always;

и я регистрирую каждый запрос POST с кодом ниже:

server {
                  log_format post_logs '[$time_local] "$request" $status '  

                  '$body_bytes_sent "$http_referer" '        

                  '"$http_user_agent" [$request_body]';
      }



location /app/ {
                  access_log  logs/post.log post_logs;
               }

Теперь мое требование состоит в том, что перед пересылкой каждого запроса я хочу отфильтровать данные тела почтового запроса для определенной строки/ключевого слова, он должен перенаправляться только на URL-адрес прокси https://example.com/abc/, если определенная строка/ключевое слово нашел в данных поста.

Я провел некоторое исследование, но не нашел ничего, что помогло бы мне достичь этого, может ли кто-нибудь помочь?

Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
1
0
76
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Не много знаю о Lua, но, надеюсь, это поможет:

location /app {
        set $flag_true 1;
        set_by_lua $flag '
            local token = ngx.var.arg_token
            local request_body = ngx.req.get_body_data()
            ngx.req.read_body()

            # do your filtering here 
            if string.find(request_body, "tiger") then
                return ngx.var.flag_true
            end
            return "false"
        ';
        if ($flag = 1) {
            proxy_pass http://x.x.x.x:8092;
            break;
        }
        echo "You do not have permission: $flag";
    }

Вдохновленный:

Отфильтровать запрос на proxy_pass с помощью lua на nginx

Как проверить, найден ли совпадающий текст в строке в Lua?

Спасибо за ответ, но If is Evil при использовании в контексте местоположения

user3782114 08.11.2022 10:00

В NGINX это само собой - ОК. Но разве это не должно быть нормально, поскольку это находится внутри контекста lua?

PHagemann 08.11.2022 10:16

Я попытался получить «nginx: [emerg] «proxy_pass» не может иметь часть URI в местоположении, заданном регулярным выражением, или внутри именованного местоположения, или внутри оператора «if», или внутри блока «limit_except» в ./conf/nginx.conf; " Ошибка

user3782114 08.11.2022 10:25

я немного поработал над вашим ответом и использовал его для своего сценария, теперь я получаю сообщение об ошибке «не удалось запустить set_by_lua *: set_by_lua: 4: API отключен в контексте set_by_lua»

user3782114 09.11.2022 10:33

Не могли бы вы обновить мой ответ или предоставить свой измененный сценарий?

PHagemann 09.11.2022 14:21
Ответ принят как подходящий

Наконец я сделал это с помощью lua:

location /app/ {
.
.
.
    
access_by_lua '
            ngx.req.read_body()
            local data = ngx.req.get_body_data()
            local  match = ngx.re.match(ngx.var.request_body, "<reqid>search</reqid>")                      

#local  match = ngx.re.match(ngx.var.request_body, "<reqid>search</reqid>","i") for case insensitive match          
            
            if match then
                #nothing to do
            else
                return ngx.exit(ngx.HTTP_FORBIDDEN)
            end';
            proxy_pass      https://example.com/abc/;
            
}   

здесь данные тела запроса будут назначены переменной «данные», и с помощью ngx.re.match мы можем сопоставить строку/ключевое слово с данными тела запроса, в приведенном выше примере, если <reqid>search</reqid> не найдено в теле запроса, он вернет 403 запрещено, если найдено, то оно будет передано в proxy_pass.

Это может быть очень полезно для фильтрации входящего запроса перед его обработкой.

Другие вопросы по теме