我想使用nginx在两个条件上重定向请求。
这不起作用:
if ($host = 'domain.com' || $host = 'domain2.com'){
rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}
这样做的正确方法是什么?
答案 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;
}
但只有当你只有弦乐时它才是好的;对于复杂的逻辑,当然,这是不正确的。