根据用户代理进行 Nginx 重定向

根据用户代理进行 Nginx 重定向

这是我当前的 nginx 配置:

server {
  listen 90;
  server_name www.domain.com www.domain2.com;
  root /root/app;
  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

它运行良好,并且www.domain.com提供www.domain2.com相同的内容。

现在我想补充一下

如果用户正在访问 www.domain.com 并且用户代理是 xxx,则重定向到 www.domain2.com

我搜索并尝试了很多方法,但都没有用。

答案1

有两种方法可以解决这个问题。

  1. 为 www.domain.com 和 www.domain2.com 设置两个单独的“服务器”块,并将以下规则行添加到“服务器”块 www.domain.com。这是解决此问题的推荐方法。

    if ($http_user_agent ~* "^xxx$") {
       rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
    }
    
  2. 如果您想使用单个“服务器”块管理两个域的重定向,请尝试以下规则

    set $check 0;
    if ($http_user_agent ~* "^xxx$") {
        set $check 1;
    }
    if ($host ~* ^www.domain.com$) {
        set $check "${check}1";
    }
    if ($check = 11) {
        rewrite ^/(.*)$ http://www.domain2.com/$1 permanent;
    }
    

答案2

步骤 1:有两个服务器块,分别用于 domain.com 和 domain2.com。

第2步:如果正确使用如果使用不当,它会产生不良后果。

这是完整的解决方案...

server {
  listen 90;
  server_name www.domain.com;
  root /root/app;

  # redirect if 'xxx' is found on the user-agent string
  if ( $http_user_agent ~ 'xxx' ) {
    return 301 http://www.domain2.com$request_uri;
  }

  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

server {
  listen 90;
  server_name www.domain2.com;
  root /root/app;
  location / {
    try_files $uri =404;
  }
  location ~ /([-\w]+)/(\w+)/ {
    proxy_pass bla bla
  }
}

答案3

推荐的方法可能是使用map,也是因为这些变量只有在使用时才会被评估。

此外,使用return 301 ...比重写更可取,因为不需要编译正则表达式。

下面是将主机和用户代理作为连接字符串与单个正则表达式进行比较的示例:

map "$host:$http_user_agent" $my_domain_map_host {
  default                      0;
  "~*^www.domain.com:Agent.*$" 1;
}

server {
  if ($my_domain_map_host) {
    return 302 http://www.domain2.com$request_uri;
  }
}

这甚至可以更加灵活,例如如果涉及的域不止 2 个,而是更多。

在这里,我们映射以到www.domain.com开头的用户代理以及精确的用户代理到:Agenthttp://www.domain2.comwww.domain2.comOther Agenthttp://www.domain3.com

map "$host:$http_user_agent" $my_domain_map_host {
  default                             0;
  "~*^www.domain.com:Agent.*$"        http://www.domain2.com;
  "~*^www.domain2.com:Other Agent$"   http://www.domain3.com;
}

server {
  if ($my_domain_map_host) {
    return 302 $my_domain_map_host$request_uri;
  }
}

注意:您需要 nginx 0.9.0 或更高版本才能使 map 中的连接字符串正常工作。

相关内容