nginx.conf重定向多个条件

mar*_*ark 49 redirect nginx

我想使用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)

  • 这个答案与我猜的新版nginx有关.我已经尝试了几个小时的重写规则工作,但我不得不采用这种方法.虽然看起来很乱,但效果还不错.谢谢 :) (2认同)

kol*_*ack 22

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

server {
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)


sha*_*oid 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;
}
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)


Col*_*ney 5

这是一种声明性方法:

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)


Nik*_*_ua 5

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

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

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