Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I use an "or" operator in an nginx "if" statement?

Tags:

nginx

For example, I want to do this:

if ($http_user_agent ~ "MSIE 6.0" || $http_user_agent ~ "MSIE 7.0" (etc, etc)) {
    rewrite ^ ${ROOT_ROOT}ancient/ last;
   break;
}

instead of this:

if ($http_user_agent ~ "MSIE 6.0") {
    rewrite ^ ${ROOT_ROOT}ancient/ last;
   break;
}
if ($http_user_agent ~ "MSIE 7.0") {
    rewrite ^ ${ROOT_ROOT}ancient/ last;
   break;
}

Nginx rejects this syntax (minus the (etc, etc)), and I don't see anything in the docs about this. Thanks in advance.

Also, we opted not to use $ancient_browser directive, so that's not an option.

like image 590
Bryce Johnson Avatar asked Apr 20 '15 19:04

Bryce Johnson


1 Answers

Edit:

As Alexey Ten didn't add a new answer, I'll edit mine to give his better answer in this case.

if ($http_user_agent ~ "MSIE [67]\.")

Original answer:

Nginx doesn't allow multiple or nested if statements however you can do this :

set $test 0;
if ($http_user_agent ~ "MSIE 6\.0") {
  set $test 1;
}
if ($http_user_agent ~ "MSIE 7\.0") {
  set $test 1;
}
if ($test = 1) {
  rewrite ^ ${ROOT_ROOT}ancient/ last;
}   

It is not shorter but it allows you to do the check and put the rewrite rule only once.

Alternative answer:

In some cases, you can also use | (pipe)

if ($http_user_agent ~ "(MSIE 6\.0)|(MSIE 7\.0)") {
  rewrite ^ ${ROOT_ROOT}ancient/ last;
}  
like image 72
Eric Ly Avatar answered Oct 22 '22 00:10

Eric Ly