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?

deb
fonte

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;
}
kolbyjack
fonte
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.

Robin van Baalen
fonte
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; 
}
udo
fonte
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;
}
ZanMax
fonte
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;

}
Taimoor Changaiz
fonte
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;
    } 
}
cryptoKTM
fonte
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