Подтвердить что ты не робот

Перенаправление субдомена с регулярным выражением в nginx

В документации nginx говорится, что директива server_name поддерживает регулярные выражения. Я ударился головой о стену, пытаясь заставить работать даже тривиальное регулярное выражение.

Я хочу http://subdomain.mydomain.com перенаправить на http://mydomain.com/subdomain

Вот мой код.

server {
  server_name "~^subdomain\.mydomain\.com$";
  rewrite ^ http://mydomain.com/subdomain;
}

Кроме того, потенциально заслуживает внимания. Далее в файле конфигурации nginx существует правило:

server {
  server_name *.mydomain.com
  ...
}

Что я делаю неправильно?

UPDATE:

Было высказано предположение о том, что я не использую регулярное выражение для этого... чтобы предложить немного большую ясность: тривиальное регулярное выражение было просто для устранения неполадок. Реальное регулярное выражение будет больше похоже на...

server {
  server_name "~^.*(cvg|cincinnati)\.fakeairport(app)?\.(org|com)$";
  rewrite ^ http://fakeairport.com/cincinnati;
}

server {
  server_name "~^.*(lex|lexington)\.fakeairport(app)?\.(org|com)$";
  rewrite ^ http://fakeairport.com/lexington;
}

Поэтому было бы предпочтительнее использовать регулярное выражение.

4b9b3361

Ответ 1

Чтобы ответить на старый вопрос, чтобы помочь другим

с помощью nginx 1.1.19 вы можете сделать следующее:

server {
    server_name     ~^(?<subdomain>\w+)\.domainA\.com$;

    location / {
            rewrite ^ https://$subdomain.domainB.com$request_uri permanent;
    }
}

Поддомен до domainA.com сопоставляется и сохраняется в переменной $subdomain, которая затем может использоваться в переписывании. Это переписывает url как xxx.domainA.com на xxx.domainB.com только с одной директивой сервера.

Ответ 2

Должен любоваться регулярным выражением с NGINX!

Поскольку я часто работаю с несколькими именами доменов, и мне нравится сохранять мои конфиги как чистые и твердые, насколько это возможно, я почти всегда использую регулярное выражение с nginx.

В этом случае я решил его со следующим регулярным выражением:

server {
    listen 80;
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$;
    return 301 $scheme://${domain}.${tld};
}

Что это такое: каждый subdomain.domain-name.tld, указывающий на этот сервер (ip-адрес), автоматически перенаправляется на domain-name.tld.

Так, например, www.myexampledomain.com перенаправляется на myexampledomain.com.

Чтобы ответить на вопрос, вы также можете сделать следующее:

server {
    listen 80;
    server_name ~^((?<subdomain>.*)\.)(?<domain>[^.]+)\.(?<tld>[^.]+)$;
    return 301 $scheme://${domain}.${tld}/${subdomain};
}

Теперь mysubdomain.myexampledomain.com преобразуется в myexampledomain.com/mysubdomain.

Выше regex отлично, поскольку вы можете выбросить что-нибудь на нем, что вам нравится, и оно преобразует его для вас.

Ответ 3

Если вы читаете правила сопоставления имен серверов, вы увидите, что префикс и суффикс server_names проверяются перед именами регулярных выражений, но после точных имен хостов. Поскольку соответствие *.mydomain.com, регулярное выражение не проверяется. Тот факт, что он был указан ранее в конфиге, не имеет значения. Поскольку вы просто пытаетесь сопоставить одно имя хоста с вашим регулярным выражением, просто:

server {
  server_name subdomain.mydomain.com;
  rewrite ^ http://mydomain.com/subdomain$request_uri?;
}

server {
  server_name *.mydomain.com;

  # stuff
}

будет работать для вас.

Ответ 4

Я знаю, что все говорят, что это зло в конфигурационных файлах nginx, но иногда вы не можете обойти другой способ.

server {
      server_name .mydomain.com;

      if ( $host ~ subdomain.mydomain.com ) {
                rewrite ^(.*) http://mydomain.com/subdomain$1;
      }
}

Ответ 5

Как комментарий. Если вы хотите перенаправить все уровни поддоменов на первый уровень поддомена, используйте, например, при использовании подстановочного SSL-сертификата, вы можете использовать:

server {
    listen 80;
    server_name ~^(.*)\.(?<subdomain>\w+).mydomain\.com$;
    return          301 https://$subdomain.mydomain.com$request_uri; 
}

server {
    listen 80;
    server_name ~^(?<subdomain>\w+).mydomain\.com$;
    return          301 https://$subdomain.mydomain.com$request_uri;
}

Первым является перенаправление субдомена уровня множественного уровня HTTP на первый уровень поддомена в https. И следующий - для перенаправления субдомена первого уровня в http на тот же поддомен в https.