我想使用nginx在两个条件下重定向请求.
这不起作用:
if ($host = 'domain.com' || $host = 'domain2.com'){
rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
}
Run Code Online (Sandbox Code Playgroud)
这样做的正确方法是什么?
Chr*_*tto 85
我之前遇到过同样的问题.因为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;
}
Run Code Online (Sandbox Code Playgroud)
kol*_*ack 22
正确的方法是使用专用服务器进行重定向:
server {
server_name domain.com domain2.com;
rewrite ^ http://www.domain.com$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)
另一种可能性是
server_name domain.com domain2.com;
set $wanted_domain_name domain.com;
if ($http_host != $wanted_domain_name) {
rewrite ^(.*)$ https://$wanted_domain_name$1;
}
Run Code Online (Sandbox Code Playgroud)
因此它会将所有内容重定向到一个特定的,但它基于我猜的用例
小智 5
将多个域重写为单个域并避免浏览器中的循环情况。
server {
listen 80;
server_name www.wanted_domain.example wanted_domain.example www.un_wanted_domain.example un_wanted_domain.example;
if ($host = 'un_wanted_domain.example'){
return 301 $scheme://www.wanted_domain.example$request_uri;
}
if ($host = 'www.un_wanted_domain.example'){
return 301 $scheme://www.wanted_domain.example$request_uri;
}
Run Code Online (Sandbox Code Playgroud)
这是一种声明性方法:
server {
listen 80;
server_name domain.com domain2.com;
return 301 $scheme://www.domain.com$uri;
}
server {
listen 80 default_server;
server_name _;
#....
}
Run Code Online (Sandbox Code Playgroud)
我认为最简单的方法就是使用正则表达式:
if ($host ~ "domain.example|domain2.example") {
rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}
Run Code Online (Sandbox Code Playgroud)
但只有当你只有字符串时它才是好的;对于复杂的逻辑,当然,这是不正确的。