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时才是好事。 对于复杂的逻辑,当然,这是不正确的。