Перенаправление субдомена с регулярным выражением в 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;
}
Поэтому было бы предпочтительнее использовать регулярное выражение.
Ответы
Ответ 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.