Reescrevendo (não redirecionando) um URL no Nginx

1

Eu tenho uma situação que acho um pouco diferente da maioria. É certamente diferente de qualquer outra que eu tenha encontrado antes:

Estou criando um site para um cliente que deseja / precisa manter o controle total sobre seu domínio canônico. Em vez de simplesmente apontar www.theirdomain.com e theirdomain.com para o IP do meu servidor, eles querem rotear o tráfego para eles e permitir que o dispositivo Big-IP envie esse tráfego para nós em client.mydomain.com . Eu não sei Big-IP, mas suspeito / presumo que isso é uma reescrita e o usuário só verá theirdomain.com .

Além disso, o cliente tem dois subdomínios cujas páginas de destino serão atendidas pelo meu aplicativo, e a equipe de SI não deseja ter nada a ver com elas. Eles estão apenas atualizando o DNS para esses domínios para apontar para o meu servidor. As páginas de destino, no entanto, são exibidas em client.mydomain.com/path/to/landing/page .

Como não queremos que os usuários finais vejam o client.mydomain.com , meu processo normal de redirecionamento 301 para a URL de resposta parece criar um tráfego desnecessário:

  1. Meu servidor responde à solicitação para sub.theirdomain.com
  2. Em vez de simplesmente responder à solicitação, meu servidor redireciona para www.theirdomain.com/path/to/landing/page
  3. O Big-IP os envia de volta para o meu servidor (o mesmo que eles acabaram de deixar), mas com o domínio correto.
  4. Meu servidor processa o conteúdo.

Na etapa 2, em vez de redirecionar para o dispositivo, posso simplesmente reescrever o URL para www.theirdomain.com e veicular o conteúdo diretamente? Melhores ideias também são bem vindas. Como eu disse, isso não é algo que eu tenha encontrado antes e estou procurando por opções.

    
por Rob Wilkerson 22.09.2014 / 20:10

1 resposta

0

Temos vários clientes configurados para que eles mantenham o controle sobre seu próprio DNS, já que alguns deles têm apenas subdomínios que apontam para nós. Estamos usando o nginx como um balanceador de carga que também lida com redirecionamentos e temos nossos redirecionamentos no arquivo vhost padrão (00default). Nada muito complexo, funciona muito bem para nós:

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;
 }

Parece-me que você pode usar uma das regras de reescrita acima, como:

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

e peça-lhes que apontem o DNS para o seu domínio no seu servidor, depois reescrevam-no como quiser.

    
por 23.09.2014 / 02:12

Tags