Я использую 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/, если определенная строка/ключевое слово нашел в данных поста.
Я провел некоторое исследование, но не нашел ничего, что помогло бы мне достичь этого, может ли кто-нибудь помочь?
Не много знаю о 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?
В NGINX это само собой - ОК. Но разве это не должно быть нормально, поскольку это находится внутри контекста lua?
Я попытался получить «nginx: [emerg] «proxy_pass» не может иметь часть URI в местоположении, заданном регулярным выражением, или внутри именованного местоположения, или внутри оператора «if», или внутри блока «limit_except» в ./conf/nginx.conf; " Ошибка
я немного поработал над вашим ответом и использовал его для своего сценария, теперь я получаю сообщение об ошибке «не удалось запустить set_by_lua *: set_by_lua: 4: API отключен в контексте set_by_lua»
Не могли бы вы обновить мой ответ или предоставить свой измененный сценарий?
Наконец я сделал это с помощью 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.
Это может быть очень полезно для фильтрации входящего запроса перед его обработкой.
Спасибо за ответ, но If is Evil при использовании в контексте местоположения