Skip to content

Instantly share code, notes, and snippets.

@jrom
Created February 7, 2012 17:14
Show Gist options
  • Save jrom/1760790 to your computer and use it in GitHub Desktop.
Save jrom/1760790 to your computer and use it in GitHub Desktop.
nginx hack for multiple conditions
if ($request_uri = /) {
set $test A;
}
if ($host ~* teambox.com) {
set $test "${test}B";
}
if ($http_cookie !~* "auth_token") {
set $test "${test}C";
}
if ($test = ABC) {
proxy_pass http://teambox-cms.heroku.com;
break;
}
@Azzurite
Copy link

Azzurite commented Sep 6, 2019

Seems, you are not familiar with map, or do not like it. More short and elegant:

":" is used just like delimiter, you can use any other symbol not used in checked variables.

map "$request_uri:$host:$http_cookie" $test {
    default 0;
    "/:teambox.com:auth_token"  1;
}

server {
    if ( $test ) {
      proxy_pass http://teambox-cms.heroku.com;
      break;
    }
}

@songsfromthewood Actually no, yours does not match "test.teambox.com" while the original post does.

@boddumanohar
Copy link

this is awesome!

@GoodJob
Copy link

GoodJob commented Mar 17, 2021

Need explanation.... what actually this does:
if ($host ~* teambox.com) {
set $test "${test}+teambox.com";
}
Does it takes "this".teambox.com or what? Thanks!

How to write this condition?

if ($host *.teambox.com) {
set $subdomain_name = ?;
}

Thanks!

@lordspace
Copy link

lordspace commented Jun 26, 2023

Awesome!!!! Thanks!
If somebody needs an explanation what the code does is it sequentially appends different letters to one variable.
When all the letters are present that means that all the required conditions have been met.

@eladnava
Copy link

This works great!

I recommend initializing the $test variable outside and above all the conditional statements to avoid endless using uninitialized "test" variable errors piling up in /var/log/nginx/error.log as follows:

set $test "";

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment