Nginx redireciona todos os subdomínios antigos para um novo

10

Como eu tinha um domínio muito longo, decidi alterá-lo para um mais curto e mais amigável. Mas como tenho muitos subdomínios (na verdade, tenho um curinga de subdomínio), eu queria manter o subdomínio enquanto alterava apenas a parte do domínio. Então, eu fiz a seguinte regra:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;

  rewrite ^ $scheme://$1.doma.in$request_uri? permanent;
}

Eu li muitas outras perguntas em que esse trecho resolveu o problema. Mas comigo, o Nginx sempre redireciona para .domain.in, sem subdomínios. o que estou perdendo? Testei o regex contra o regex101 e os exemplos funcionam bem, o Nginx parece incapaz de redirecioná-lo.

ranisalt
fonte

Respostas:

22

Como as capturas nomeadas nginx 0.8.25 podem ser usadas em server_name. Você deveria usá-los.

Aqui, o sub-domínio irá ser armazenado em uma variável chamada $sub. Então você poderá reutilizá-lo na rewritediretiva:

server {
  listen 80;
  server_name ~^(?<sub>\w+)\.olddomain\.com$;
  rewrite ^ $scheme://$sub.doma.in$request_uri? permanent;
}

Como alternativa, você pode manter seu Regex real e usá-lo $1em uma returndiretiva:

server {
  listen 80;
  server_name ~^(\w+)\.olddomain\.com$;
  return 301 $scheme://$1.doma.in$request_uri;
}

Por fim, observe que a returndiretiva é a melhor abordagem para um redirecionamento. Você pode encontrar o Pitfalls usando rewriteum redirecionamento.

krisFR
fonte
Perfeito. Eu usei a abordagem de retorno, mas ainda nomeei a parte regex, é muito mais fácil de entender.
ranisalt
E se quisermos redirecionar sem um subdomínio (www) também? como: sub1.ex.to> sub1.new.in e ex.to> www.new.in?
R. Canser Yanbakan
1
Observe que '\ w' não corresponde a certos caracteres que podem estar em nomes de domínio, por exemplo, '-'. O regex acima será redirecionado test-sub.doma.inpara .domai.in!
Wolfgang
use [\ w \ - \ _] + em vez de \ w + para subdomínios que possuem - e _ neles
Sajjad Ashraf
O que ~a regex faz no começo? Não faz desde que algo apareça antes ^em regex.
precisa saber é o seguinte