2017-05-29 73 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
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; 
    } 
    }