Nginx przekierowuje wszystkie stare subdomeny domen do nowych

10

Miałem bardzo długą domenę, więc postanowiłem zmienić ją na krótszą i bardziej przyjazną. Ale ponieważ mam wiele subdomen (w rzeczywistości mam symbol wieloznaczny subdomeny), chciałem zachować subdomenę, zmieniając tylko część domeny. Dlatego wprowadziłem następującą zasadę:

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

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

Przeczytałem wiele innych pytań, w których ten fragment rozwiązał problem. Ale ze mną Nginx zawsze przekierowuje do .domain.in, bez żadnych subdomen. czego mi brakuje? Przetestowałem regex na regex101 i przykłady działają dobrze, Nginx wydaje się nie być w stanie go przekierować.

ranisalt
źródło

Odpowiedzi:

22

Ponieważ nginx 0.8.25 nazwane przechwytywania mogą być używane w nazwa_serwera. Powinieneś ich użyć.

Poddomena będzie tutaj przechowywana w zmiennej o nazwie $sub. Będziesz mógł ponownie użyć go w rewritedyrektywie:

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

Alternatywnie możesz zachować swój Regex i użyć go $1w returndyrektywie:

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

Na koniec zauważ, że returndyrektywa jest najlepszym podejściem do przekierowania. Możesz napotkać pułapki, używając rewriteprzekierowania.

krisFR
źródło
Doskonały. Użyłem metody zwrotu, ale nadal nazwałem część wyrażenia regularnego, jest o wiele łatwiejsze do zrozumienia.
ranisalt
Co jeśli chcemy również przekierowywać bez poddomeny (www)? jak: sub1.ex.to> sub1.new.in i ex.to> www.new.in?
R. Canser Yanbakan
1
Zauważ, że „\ w” nie pasuje do niektórych znaków, które mogą znajdować się w nazwach domen, np. „-”. Powyższe wyrażenie regularne przekieruje zatem test-sub.doma.inna .domai.in!
Wolfgang,
użyj [\ w \ - \ _] + zamiast \ w + dla poddomen, które mają - i _ w nich
Sajjad Ashraf
Co robi ~regex na początku? Nie robi się, ponieważ coś pojawi się wcześniej ^w wyrażeniu regularnym.
hobbes3