在nginx中用正则expression式redirect一个子域

nginx文档说server_name指令支持正则expression式。 我一直在撞墙,试图得到一个微不足道的正则expression式。

我希望http://subdomain.mydomain.comredirect到http://mydomain.com/subdomain

这是我的代码。

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

另外,可能值得注意。 在nginxconfiguration文件中还有一条规则:

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

我究竟做错了什么?

更新:

有人build议我不要使用正则expression式来提供更多的清晰度:微不足道的正则expression式仅仅是为了排除故障的目的。 真正的正则expression式看起来更像…

 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; } 

所以最好使用正则expression式。

回答一个老问题来帮助别人

使用nginx 1.1.19你可以做到以下几点:

 server { server_name ~^(?<subdomain>\w+)\.domainA\.com$; location / { rewrite ^ https://$subdomain.domainB.com$request_uri permanent; } } 

domainA.com之前的子域被匹配并存储在变量$ subdomain中,然后可以用于重写。 这只需要一个服务器指令就可以将xxx.domainA.com这样的网址重写为xxx.domainB.com。

得到爱与NGINX的正则表达式!

由于我经常使用多个域名,而且我希望保持我的配置尽可能干净和坚固,所以我几乎总是使用nginx的正则表达式。

在这种情况下,我用下面的正则表达式解决了它:

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

这是做什么的:每个指向该服务器(IP地址)的subdomain.domain-name.tld自动重定向到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

以上正则表达式是伟大的,因为你可以扔任何你喜欢的东西,它会转换为你。

如果您阅读了server_name匹配规则 ,则会看到前缀和后缀server_names在正则表达式名称之前被检查,但在确切的主机名之后。 由于* .mydomain.com匹配,正则表达式没有测试。 它在配置早期列出的事实没有什么区别。 既然你只是试图用你的正则表达式匹配一个主机名,一个简单的:

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

会为你工作。

我知道每个人都在说,如果是在nginx配置文件中是邪恶的,但有时你不能绕过任何其他方式。

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

就像一个评论。 如果您想要将所有子域级别重定向到第一个子域级别,例如,当您使用通配符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; } 

首先是将https多级别子域重定向到https中的第一个子域级别。 接下来是将http中的第一级子域重定向到https中的同一子域。