在 Nginx 中重写(而不是重定向)URL

在 Nginx 中重写(而不是重定向)URL

我遇到的情况与大多数人的情况有些不同。这肯定与我以前遇到过的任何情况都不同:

我正在为一位客户建立一个网站,这位客户希望/需要保留对其规范域的完全控制权。他们不想简单地将www.theirdomain.comtheirdomain.com指向我的服务器 IP,而是希望将流量路由到他们,并让他们的 Big-IP 设备将该流量发送给我们client.mydomain.com。我不知道 Big-IP,但我怀疑/假设这是一个重写,用户只会看到theirdomain.com

此外,客户有 2 个子域,它们的登录页面将由我的应用提供,他们的 IS 团队不想与它们有任何关系。他们只是更新这些域的 DNS 以指向我的服务器。不过,登录页面由 提供client.mydomain.com/path/to/landing/page

因为我们不希望最终用户看到client.mydomain.com,所以我通常对应答 URL 进行 301 重定向,但这似乎会产生一些不必要的流量:

  1. 我的服务器回答请求sub.theirdomain.com
  2. 我的服务器并没有直接回答请求,而是重定向到www.theirdomain.com/path/to/landing/page
  3. 他们的 Big-IP 将他们直接发送回我的服务器(他们刚刚离开的服务器),但使用正确的域名。
  4. 我的服务器呈现内容。

www.theirdomain.com在第 2 步中,我是否可以简单地重写 URL并直接提供内容,而不是重定向到他们的设备?也欢迎更好的想法。正如我所说,这不是我以前遇到过的事情,我正在寻找选择。

答案1

我们有几个客户设置了它,这样他们就可以控制自己的 DNS,因为其中一些客户只有指向我们的子域。我们使用 nginx 作为负载平衡器,它还可以处理重定向,并且我们在默认 vhost 文件 (00default) 中有重定向。没有什么太复杂的,它对我们来说非常有效:

if ($host ~* "^ourdomain.com$") {
  rewrite ^(.*)$ http://www.ourdomain.com$1 permanent;
}

if ($host ~* "^subdomain.otherdomain.com$") {
  rewrite ^(.*)$ https://ourdomain.com$1 permanent;
}

if ($uri !~* (/option/.*|/simple/.*|/embed/.*|/mini/.*|/someOtherOption\.action.*|/otherOption\.action.*|/file/[0-9a-zA-Z]+/html5.*|/file/[0-9a-zA-Z]+/html5mobile.*|/thumbnail/.*) ) {
  set $cname_match "N";
}

if ($host !~* "(.*\.)?ourdomain\.com|videos\.yetanotherdomain\.com") {
  set $cname_match "${cname_match}N";
}
if ($cname_match = "NN") { rewrite ^.*$ http://www.ourdomain.com/; }

if ($uri !~* (/thumbnail_.*|/vcomments/.*|/onethmb.gif$|/crossdomain.xml$|/otherthmb[0-9]+.gif$)) {
  set $thumb_redirect "Y";
}
    if ($host ~* "^(cdn-)?thumbs\.ourdomain\.com") {
      set $thumb_redirect "${thumb_redirect}Y";
    }
    if ($thumb_redirect = "YY") { rewrite ^.*$ http://www.ourdomain.com/ permanent; }

 location / {
   proxy_pass      http://ourdomain_apache_pool;
   error_page 404 @fallback404;
   error_page 403 @fallback403;
 }
 # redirects
 location /learn-more {
   rewrite /learn-more/? http://www.ourdomain.com/features permanent;
 }
 # help
 location ~* ^/help/zendesk/*.*$ {
   proxy_pass      http://ourdomain_ruby_pool;   
 }
 location ~* ^/help/*.* {
   rewrite ^/(.*) http://support.ourdomain.com permanent;
 }

在我看来,您可以采用上述重写规则之一,例如:

if ($host ~* "^subdomain.otherdomain.com$") {
  rewrite ^(.*)$ https://ourdomain.com$1 permanent;
}

让他们将 DNS 指向您服务器上的域,然后根据您的需要重写它。

相关内容