Como redirecionar para um domínio diferente usando o NGINX?


136

Como redirecionar mydomain.come qualquer subdomínio *.mydomain.compara www.adifferentdomain.comusar o NGINX?

Respostas:


276

server_name suporta correspondências de sufixos usando a sintaxe .mydomain.com:

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

ou em qualquer versão 0.9.1 ou superior:

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

1
Não preciso colocar uma porta para ouvir? por exemplo, ouça 80. Tenho vários domínios que preciso redirecionar para um domínio primário, mas meu servidor também possui vários servidores virtuais para vários outros domínios.
22713 Ryan

1
@Ryan A listendiretiva padrão é a porta 80 quando não especificada. Na verdade, é um pouco mais complicado do que isso em geral; consulte os documentos de configuração do nginx para obter mais detalhes.
Yitz 23/09

2
O que a ?conquista alcança no final?
Dan Dascalescu

5
Qual é a diferença entre rewritee return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu

6
O ? no final de uma reescrita, diz ao nginx para não acrescentar a string de consulta original. Como $request_urijá possui a string de consulta, não há necessidade de anexá-la novamente. A return 301sintaxe é mais recente e não deve haver diferença de comportamento entre os dois métodos, mas quando eu originalmente respondi a essa pergunta, muitas distribuições não tinham a versão necessária, por isso fui com a sintaxe mais segura.
Kolbyjack


15

Por que usar o módulo de reescrita, se você pode fazer return? Tecnicamente falando, returnfaz parte do módulo de reescrita, como você pode ler aqui, mas esse trecho é mais fácil de ler na imho.

server {
    server_name  .domain.com;

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

Você também pode redirecioná-lo 301.


1
Isso manterá os parâmetros de caminho e consulta também?
MPEN

3
Não, este exemplo não faz isso @ Mark. Mas eu suponho que você pode misturar as respostas anteriores para chegar a algo como isto:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen

Em uma nota lateral, em muitos casos, você provavelmente deve redirecionar para https em vez de preservar o esquema (ou seja, usar https em vez de $). Isto é, pelas mesmas razões ligações relativas ao protocolo são agora considerados obsoletos - paulirish.com/2010/the-protocol-relative-url
mahemoff

@ mahemoff Isso não é totalmente verdade. Considere o caso de ter o servidor web atrás de um loadbalancer que está descarregando ssl.
Sebastian Neira

11

Isso deve funcionar via HTTPRewriteModule .

Exemplo de reescrita de www.example.com para example.com:

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

isso é apenas redirecionar www.example.com para example.com. Quero redirecionar os dois para um domínio diferente. Posso fazer isso em uma regra?
deb 18/05

Não sei ao certo, mas acho que server_name mydomain.com; reescreva www.adifferentdomain.com permanente; } deve fazer isso? Isso deve levar tudo * .meudominio.com?
Udo

@ deb você teria apenas server_name example.com www.example.com;.
Cituspi 22/08/2012

A pergunta solicita especificamente que qualquer subdomínio seja redirecionado para um domínio diferente . Esta resposta não responde a nenhum dos dois (explicitamente).
Kissaki

faltam os 301 importantes!
Sliq 02/05/19

9

Se você deseja redirecionar solicitações de "domain1.com" para "domain2.com", crie um bloco de servidor parecido com este:

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

Alguém pode precisar redirecionar https: // solicitar também. listen 443;
Rafik Farhad

0

Redirecionamento temporário

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

Redirecionamento permanente

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

No arquivo de configuração nginx para site específico:

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

}

0

Você pode simplesmente escrever uma condição if dentro do bloco do servidor {}:

server { 

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

Você precisa ter cuidado ao usar as instruções 'if' no Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ). Nesse caso, você pode apenas usar 'server_name mydomain.com'.
Marty

if for evil quando usado no contexto do local, é seguro quando usado para especificar o host de redirecionamento
cryptoKTM
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.