nginx.confredirect多个条件

我想使用nginx在两个条件下redirect请求。

这不起作用:

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

什么是正确的方法来做到这一点?

我以前有过这个相同的问题。 由于nginx不能执行复杂的条件或嵌套if语句,因此需要评估2个以上的不同expression式。

将variables设置为某个二进制值,然后在两个不同的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; } 

正确的方法是使用专用服务器进行redirect:

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

另一种可能性是

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

所以它会redirect到一个特定的,但它是基于我猜的用例

这是一个声明式的方法:

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

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

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

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

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

但只有当你只有string时才是好事。 对于复杂的逻辑,当然,这是不正确的。