I'm trying to configure NGINX/OpenResty to proxy SOAP calls to 2 different servers based on a string present on the SOAP request.
What I'm able to do:
I am able to proxy requests to 2 different servers based on the path the SOAP client is calling:
location /pathA {
proxy_pass http://www.ServerA.com/PathA/;
}
location /pathB {
proxy_pass http://www.ServerB.com/PathB/;
}
What I can't do:
I can't separate the traffic based on the content of the request. The main reason I believe is that I can't correctly assemble the LUA script to extract the information and later use it to proxy the request.
location / {
conten_by_lua '
ngx.req.read_body()
local match = ngx.re.match(ngx.var.request_body,"STRING TO FIND")
if match then
proxy_pass http://www.ServerA.com/PathA/;
else
proxy_pass http://www.ServerB.com/PathB/;
how can I achieve this?
I installed OpenResty and LUA is working fine.
I think I read somewhere that if the request is not an HTTP POST ngx.req.read_body()
would not work. Is that correct?
Thank you for your help.
Best Answer
You almost did it youself, the only thing I would do differently is to use
rewrite_by_lua
instead ofcontent_by_lua
:If request is not an HTTP POST or has an empty body,
ngx.req.read_body()
will returnnil
, so it is better to add an additional check:You also can limit allowed methods:
One more thing. With this configuration, if you specify your backends with domain names instead of IP addresses, you'll need a
resolver
directive in your config. You can use your local name server if you have one, or use something external like Google public DNS (8.8.8.8) or DNS provided for you by your ISP.