nginx.conf redirect multiple conditions

2020-05-12 04:58发布

I want to redirect requests on two conditions using nginx.

This doesn't work:

  if ($host = 'domain.com' || $host = 'domain2.com'){
    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
  }   

What is the correct way to do this?

6条回答
Viruses.
2楼-- · 2020-05-12 05:17

Here's a declarative approach:

server {
    listen       80;
    server_name  domain.com domain2.com;
    return 301 $scheme://www.domain.com$uri;    
}

server {
    listen       80  default_server;
    server_name  _;
    #....
}
查看更多
SAY GOODBYE
3楼-- · 2020-05-12 05:17

another possibility would be

server_name domain.com domain2.com;
set $wanted_domain_name domain.com;
if ($http_host != $wanted_domain_name) {
    rewrite  ^(.*)$  https://$wanted_domain_name$1;
}

so it will redirect all to one specific but it's based on the usecase i guess

查看更多
叼着烟拽天下
4楼-- · 2020-05-12 05:29

I had this same problem before. Because nginx can't do complex conditions or nested if statements, you need to evaluate over 2 different expressions.

set a variable to some binary value then enable if either condition is true in 2 different if statements:

set $my_var 0;
if ($host = 'domain.com') {
  set $my_var 1;
}
if ($host = 'domain2.com') {
  set $my_var 1;
}
if ($my_var = 1) {
  rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}   
查看更多
Root(大扎)
5楼-- · 2020-05-12 05:31

Rewriting multiple domains to a single domain and avoiding a looping condition in the browser.

server {
    listen       80;
    server_name  www.wanted_domain.com wanted_domain.com www.un_wanted_domain.com un_wanted_domain.com;
    if ($host = 'un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
    if ($host = 'www.un_wanted_domain.com'){
       return 301 $scheme://www.wanted_domain.com$request_uri;
    }
查看更多
Deceive 欺骗
6楼-- · 2020-05-12 05:32

The correct way would be to use a dedicated server for the redirect:

server {
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
查看更多
手持菜刀,她持情操
7楼-- · 2020-05-12 05:36

I think the easiest way to do it it's just use regular expression:

if ($host ~ "domain.com|domain2.com") {
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

But it's good only when you have only strings; for complex logic, sure, it is not correct.

查看更多
登录 后发表回答