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中的同一子域。