2017-05-29 16 views
7

मैं प्रॉक्सी को nginx को किसी अन्य सर्वर से अनुरोध पास करने के लिए कॉन्फ़िगर करने का प्रयास कर रहा हूं, केवल तभी जब $ request_body चर विशिष्ट नियमित अभिव्यक्ति पर मेल खाता है। लेकिन यह मेरे लिए काम नहीं कर रहा है।अनुरोध शरीर सामग्री पर आधारित nginx सशर्त प्रॉक्सी पास

server{ 
     listen 80 default; 
     server_name www.applozic.com; 

     location/{ 
       proxy_set_header X-Real-IP $remote_addr; 
       proxy_set_header X-Forwarded-For $remote_addr; 
       proxy_set_header Host $http_host; 

       if ($request_body ~* (.*)appId(.*)) { 
        proxy_pass http://apps.applozic.com; 
       } 
     } 

}

अनुरोध शरीर है ::

   { 
       "applicationId": "appId", 
       "authenticationTypeId": 1, 
       "enableEncryption": false, 
       "notificationMode": 0, 
       "deviceType": 4, 
       } 
+1

[स्थान में nginx मैच विशिष्ट शब्द] की संभावित डुप्लिकेट (https://stackoverflow.com/questions/7888165/nginx-match-specific-word-in-location) – AlexD

उत्तर

1

के रूप में सबसे अच्छा मैं बता सकता हूँ मुद्दा यह है कि चर $request_body स्मृति में समय अपने अगर बयान है पर नहीं पढ़ गया हो सकता है है क्रियान्वित।

सुझाए गए विकल्प लुआ समर्थन या compile nginx with the echo modules and run echo_request_body का उपयोग करना होगा।

1
I found the solution. 

I did following changes in nginx(open resty) config file 

upstream algoapp { 
    server 127.0.0.0.1:543; 
} 
upstream main { 
    server 127.0.0.1:443; 
} 

location /rest/ws/login { 
    proxy_set_header X-Forwarded-Host $host; 
    proxy_set_header X-Forwarded-Server $host; 
    proxy_set_header X-Real-IP $remote_addr; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Url-Scheme $scheme; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Host $http_host; 
    proxy_redirect off; 
    if ($request_method = OPTIONS) { 
    proxy_pass https://127.0.0.1:543; 
    } 
    if ($request_method = POST) { 
    set $upstream ''; 
    access_by_lua ' 
    ngx.req.read_body() 
    local data = ngx.req.get_body_data() 
    local match = ngx.re.match(ngx.var.request_body, "appId") 
    if match then 
     ngx.var.upstream = "algoapp" 
    else 
    ngx.var.upstream = "main" 
    end 
    '; 
    proxy_pass https://$upstream; 
    } 
    } 
संबंधित मुद्दे