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.

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.