Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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;
}
@GeoffreyHervet
Copy link

GeoffreyHervet commented Dec 1, 2016

Thanks !

@sinasalek
Copy link

sinasalek commented Jan 3, 2017

You are a god :D

@PeterRJones
Copy link

PeterRJones commented Feb 17, 2017

Great solution! For those suggestion a map, that is great if condition variable remains the same for all checks. If not, this solution trumps map.
+1

@danlsgiga
Copy link

danlsgiga commented Apr 5, 2017

Thanks for this but I prefer to use @songsfromthewood map solution.

@glamrock
Copy link

glamrock commented May 16, 2017

@songsfromthewood's example works great, with the exception of empty strings (like referer or useragent). But for blank referer and useragent, it's still pretty good :D

@aluttik
Copy link

aluttik commented Aug 30, 2017

for those who haven't read this yet: If Is Evil

@nkn786
Copy link

nkn786 commented Nov 30, 2017

Hi All,

I am checking the header "x-token" present from the incoming request if not i have to send 403 in nginx below is my code

if ($http_x-token = ""){
return 403;
break;
}
proxy_pass http://127.0.0.1:1234;

But here "-" is the problem so how do i achieve this. if i pass the header as "xtoken" its working as expected
Could you please any one guide on this query.

Regards,
Naveen

@NickHibma
Copy link

NickHibma commented Dec 15, 2017

nkn786, try $http_x_token.

@havilchis
Copy link

havilchis commented Jul 28, 2018

You truly are the king of kings

@onier
Copy link

onier commented Aug 10, 2018

awesome ! 666666

@ezra-obiwale
Copy link

ezra-obiwale commented Aug 17, 2018

Nice. Thanks

@escudero89
Copy link

escudero89 commented Jun 11, 2019

Awesome man, thanks.

@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

boddumanohar commented Mar 13, 2020

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!

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