nginx.conf重定向多个条件

时间:2011-01-28 21:30:42

标签: redirect nginx

我想使用nginx在两个条件上重定向请求。

这不起作用:

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

这样做的正确方法是什么?

6 个答案:

答案 0 :(得分:83)

之前我遇到过同样的问题。因为nginx不能执行复杂条件或嵌套if语句,所以需要评估2个不同的表达式。

将变量设置为某个二进制值,然后在两个不同的if语句中,如果任一条件为真,则启用:

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;
}   

答案 1 :(得分:21)

正确的方法是使用专用服务器进行重定向:

server {
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}

答案 2 :(得分:5)

另一种可能性是

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

所以它会将所有内容重定向到一个特定的但是它基于用例我猜

答案 3 :(得分:5)

这是一种声明式方法:

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

server {
    listen       80  default_server;
    server_name  _;
    #....
}

答案 4 :(得分:4)

  

将多个域重写为单个域,并避免在浏览器中出现循环条件。

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;
    }

答案 5 :(得分:1)

我认为最简单的方法就是使用正则表达式:

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

但只有当你只有弦乐时它才是好的;对于复杂的逻辑,当然,这是不正确的。