【问题标题】:How to redirect to a different domain using NGINX?如何使用 NGINX 重定向到不同的域?
【发布时间】:2011-08-28 01:13:30
【问题描述】:

如何使用 NGINX 将 mydomain.com 和任何子域 *.mydomain.com 重定向到 www.adifferentdomain.com

【问题讨论】:

    标签: redirect nginx vhosts


    【解决方案1】:

    我正在为我的网站使用此代码

    server {
            listen 80;
            listen 443;
            server_name  .domain.com;
    
            return 301 $scheme://newdomain.com$request_uri;
    }
    

    【讨论】:

      【解决方案2】:

      您可以在 server {} 块内简单地编写一个 if 条件:

      server { 
      
          if ($host = mydomain.com) {
              return 301 http://www.adifferentdomain.com;
          } 
      }
      

      【讨论】:

      • 您需要小心在 Nginx (nginx.com/resources/wiki/start/topics/depth/ifisevil) 上使用 'if' 语句。在这种情况下,您可以改用“server_name mydomain.com”。
      • 如果在位置上下文中使用是邪恶的,在用于指定重定向主机时是安全的
      【解决方案3】:

      临时重定向

      rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;
      

      永久重定向

      rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;
      

      在特定站点的 nginx 配置文件中:

      server {    
          server_name www.example.com;
          rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;
      
      }
      

      【讨论】:

        【解决方案4】:

        server_name 支持使用 .mydomain.com 语法进行后缀匹配:

        server {
          server_name .mydomain.com;
          rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
        }
        

        或任何 0.9.1 或更高版本:

        server {
          server_name .mydomain.com;
          return 301 http://www.adifferentdomain.com$request_uri;
        }
        

        【讨论】:

        • 我不需要放一个端口来监听吗?例如听 80. 我有多个域需要重定向到主域,但我的服务器也有多个用于其他各种域的虚拟服务器。
        • @Ryan listen 指令在未指定时默认为端口 80。它实际上比一般情况要复杂一些。有关详细信息,请参阅nginx configuration docs
        • ?最后实现了什么?
        • rewritereturn 301 $scheme://www.adifferentdomain.com$request_uri;有什么区别?
        • 那个?在重写结束时告诉 nginx 不要附加原始查询字符串。由于$request_uri 已经有查询字符串,因此无需再次附加它。 return 301 语法较新,两种方法的行为应该没有区别,但是当我最初回答这个问题时,很多发行版都没有所需的版本,所以我选择了更安全的语法。
        【解决方案5】:

        如果您想将“domain1.com”的请求重定向到“domain2.com”,您可以创建一个如下所示的服务器块:

        server {
            listen 80;
            server_name domain1.com;
            return 301 $scheme://domain2.com$request_uri;
        }
        

        【讨论】:

        • 有人可能还需要重定向 https:// 请求。 listen 443;
        • @RafikFarhad listen 443 ssl;
        【解决方案6】:
        server {
            server_name .mydomain.com;
            return 301 http://www.adifferentdomain.com$request_uri;
        }
        

        http://wiki.nginx.org/HttpRewriteModule#return

        http://wiki.nginx.org/Pitfalls#Taxing_Rewrites

        【讨论】:

          【解决方案7】:

          如果可以return,为什么还要使用重写模块?从技术上讲,return 是作为you can read here 重写模块的一部分,但这个 sn-p 更容易阅读恕我直言。

          server {
              server_name  .domain.com;
          
              return 302 $scheme://forwarded-domain.com;
          }
          

          你也可以给它一个 301 重定向。

          【讨论】:

          • 这会保留路径和查询参数吗?
          • 不,这个例子没有这样做@Mark。但我想你可以把以前的答案混在一起,得出这样的结论:return 302 $scheme://forwarded-domain.com$request_uri;
          • 附带说明,在许多情况下,您可能应该只重定向到 https 而不是保留方案(即使用 https 而不是 $scheme)。这与现在认为已弃用协议相关链接的原因相同 - paulirish.com/2010/the-protocol-relative-url
          • @mahemoff 这并不完全正确。考虑让网络服务器位于释放 ssl 的负载均衡器后面的情况。
          【解决方案8】:

          这应该通过HTTPRewriteModule 工作。

          示例从 www.example.com 重写为 example.com:

          server {    
              server_name www.example.com;    
              rewrite ^ http://example.com$request_uri? permanent; 
          }
          

          【讨论】:

          • 这只是将 www.example.com 重定向到 example.com。我想将两者都重定向到不同的域。我可以在一个规则中做到这一点吗?
          • 我不确定,但我认为 server_name mydomain.com;永久重写 www.adifferentdomain.com;应该这样做吗?这应该占用所有 *.mydomain.com?
          • @deb 你只需要server_name example.com www.example.com;
          • 这个问题特别要求任何子域重定向到一个不同的域。这个答案(明确地)没有回答这两个问题。
          • 这缺少重要的 301 !
          猜你喜欢
          • 1970-01-01
          • 2019-01-19
          • 2011-05-18
          • 1970-01-01
          • 2011-05-22
          • 2020-03-17
          • 2020-05-28
          • 2017-12-22
          • 1970-01-01
          相关资源
          最近更新 更多