nginx.conf 重定向多个条件

Posted

技术标签:

【中文标题】nginx.conf 重定向多个条件【英文标题】:nginx.conf redirect multiple conditions 【发布时间】:2011-06-17 12:32:02 【问题描述】:

我想使用 nginx 在两个条件下重定向请求。

这不起作用:

  if ($host = 'domain.com' || $host = 'domain2.com')
    rewrite ^/(.*)$ http://www.domain.com/$1 permanent;
     

这样做的正确方法是什么?

【问题讨论】:

许多人批评使用“if”块而不是单独的服务器块,但在添加单独的服务器块会增加很多复杂性的情况下,这是一个完全可以接受的解决方案。例如。对于 https,您可以避免再次指定所有 SSL 配置。 【参考方案1】:

我之前也遇到过同样的问题。因为 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;
   

【讨论】:

我猜这个答案与新版本的 nginx 有关。我已经尝试了几个小时来让重写规则起作用,但我不得不采用这种方法。虽然它看起来很乱,但它工作得很好。谢谢:) @Jaap 大多数 nginx IF 问题是因为在 LOCATION 内部使用 IF,大多数情况下,服务器级别的 IF 都很好......它们仍然应该避免并用位置、geoip 和地图替换可能的话,但有些情况是你无法避免的【参考方案2】:

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

server 
  server_name domain.com domain2.com;
  rewrite ^ http://www.domain.com$request_uri? permanent;

【讨论】:

感谢您的回复。这会导致 nginx 无法重新/启动。 您收到的错误信息是什么?我发布的内容不会与 if 放在同一个地方,因为 if 已经在服务器中。它将是您已经拥有的服务器块的兄弟。 @mark 这是一个新服务器,你必须从现有配置中删除 domain.com 和 domain2.com,以避免重复的 server_names 我投了赞成票,因为它对一台服务器有效。但是,在另一个多租户 nginx 服务器上,它没有。奇数【参考方案3】:

另一种可能性是

server_name domain.com domain2.com;
set $wanted_domain_name domain.com;
if ($http_host != $wanted_domain_name) 
    rewrite  ^(.*)$  https://$wanted_domain_name$1;

所以它会将所有重定向到一个特定的,但它基于我猜的用例

【讨论】:

这实际上不是推荐的方法,因为if () 检查现在发生在每个请求上。最好设置两个服务器块,其中一个(用于不需要的域)只进行重定向。 @BenXO 谢谢,我知道。仍然有可能:) 因为还有很多其他的。【参考方案4】:

这是一种声明式方法:

server 
    listen       80;
    server_name  domain.com domain2.com;
    return 301 $scheme://www.domain.com$uri;    


server 
    listen       80  default_server;
    server_name  _;
    #....

【讨论】:

这看起来像一个循环 对 domain.com 或 domain2.com 的请求仅与第一个服务器节匹配。请注意,这是完全匹配的;不是通配符。在第二个服务器节中匹配任何其他内容。这就是使它具有声明性的原因。 @Unicornist:这不是一个循环,因为它是从domain.comdomain2.com 重定向到www.domain.comwww 主机与第一个服务器块不匹配。【参考方案5】:

将多个域重写为单个域并避免浏览器中的循环条件。

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;
    

【讨论】:

应该避免这种情况,不需要使用 IF,其中 2 个(或更多)不同的服务器,一个普通服务器和另一个用于重定向的服务器更快更干净【参考方案6】:

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

if ($host ~ "domain.com|domain2.com") 
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;

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

【讨论】:

以上是关于nginx.conf 重定向多个条件的主要内容,如果未能解决你的问题,请参考以下文章

nginx 301 重定向到不正确的虚拟主机

nginx的多域httphttps同时访问配置及http重定向https

nginx-设置默认虚拟主机设置域名重定向设置用户认证

nginx 域名重定向

将 Http 重定向到 Elastic BeansTalk、Tomcat、Nginx 中的 Https

nginx重写重定向文件夹