Nginx Proxy Route by Query Parameter
Here comes our requirement, I need to route to different backend based on the URL query parameters. If parameter=1, I need go server1, parameter=2, I need go server2.
Here is how I test that
resolver 8.8.8.8;
set $ocpServer 'https://ocp.sillycat.com';
set $testServer 'http://requestbin.fullcontact.com/1ki7o9g1';
location / {
if ( $http_user_agent = 'oldclients' ) {
proxy_pass http://local-sillycat-external-ip:5080;
}
if ( $http_user_agent != 'oldclients' ) {
proxy_pass $ocpServer;
}
#for testing the header, comments out
if ( $arg_api = 'describeNode') {
proxy_pass $testServer;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Sillycat-Agent 'nginx';
proxy_ssl_server_name on;
}
In this case, I will go to different route based on http_user_agent header, but the top condition is api=describeNode, it this query parameter exists, I will go to $testServer which my testing end point.
References:
https://stackoverflow.com/questions/23988344/making-nginx-check-parameter-in-url#
https://serverfault.com/questions/811912/can-nginx-location-blocks-match-a-url-query-string
Here comes our requirement, I need to route to different backend based on the URL query parameters. If parameter=1, I need go server1, parameter=2, I need go server2.
Here is how I test that
resolver 8.8.8.8;
set $ocpServer 'https://ocp.sillycat.com';
set $testServer 'http://requestbin.fullcontact.com/1ki7o9g1';
location / {
if ( $http_user_agent = 'oldclients' ) {
proxy_pass http://local-sillycat-external-ip:5080;
}
if ( $http_user_agent != 'oldclients' ) {
proxy_pass $ocpServer;
}
#for testing the header, comments out
if ( $arg_api = 'describeNode') {
proxy_pass $testServer;
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Sillycat-Agent 'nginx';
proxy_ssl_server_name on;
}
In this case, I will go to different route based on http_user_agent header, but the top condition is api=describeNode, it this query parameter exists, I will go to $testServer which my testing end point.
References:
https://stackoverflow.com/questions/23988344/making-nginx-check-parameter-in-url#
https://serverfault.com/questions/811912/can-nginx-location-blocks-match-a-url-query-string