Nginx redirige tous les anciens sous-domaines de domaine vers un nouveau

10

J'avais un domaine très long, j'ai donc décidé de le changer en un domaine plus court et plus convivial. Mais comme j'ai beaucoup de sous-domaines (en fait, j'ai un caractère générique de sous-domaine), je voulais garder le sous-domaine tout en changeant uniquement la partie domaine. J'ai donc fait la règle suivante:

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

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

J'ai lu beaucoup d'autres questions où cet extrait de code a résolu le problème. Mais avec moi, Nginx redirige toujours vers .domain.in, sans aucun sous-domaine. Qu'est-ce que je rate? J'ai testé l'expression régulière contre regex101 et les exemples fonctionnent correctement, Nginx semble incapable de le rediriger.

ranisalt
la source

Réponses:

22

Depuis nginx 0.8.25, les captures nommées peuvent être utilisées dans server_name. Vous devez les utiliser.

Ici, le sous-domaine sera stocké dans une variable appelée $sub. Vous pourrez ensuite le réutiliser dans la rewritedirective:

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

Alternativement, vous pouvez conserver votre Regex réel et l'utiliser $1dans une returndirective:

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

Enfin, notez que la returndirective est la meilleure approche pour une redirection. Vous pouvez rencontrer des pièges en utilisant rewriteune redirection.

krisFR
la source
Parfait. J'ai utilisé l'approche du retour mais j'ai toujours nommé la partie regex, c'est beaucoup plus facile à comprendre.
ranisalt
Et si nous voulons également rediriger sans sous-domaine (www)? comme: sub1.ex.to> sub1.new.in et ex.to> www.new.in?
R. Canser Yanbakan
1
Notez que '\ w' ne correspond pas à certains caractères qui peuvent être dans les noms de domaine, par exemple '-'. La regex ci-dessus sera donc redirigée test-sub.doma.invers .domai.in!
Wolfgang
utilisez [\ w \ - \ _] + au lieu de \ w + pour les sous-domaines qui contiennent - et _
Sajjad Ashraf
Que fait ~le regex au début? Cela ne fait pas puisque que quelque chose apparaîtrait auparavant ^dans regex.
hobbes3