将通配符子域redirect到https(nginx)

我有一个通配符sslauthentication,我试图将所有非sslstream量redirect到ssl。 目前,我正在使用以下redirect的非子域名url工作正常。

server { listen 80; server_name mydomain.com; #Rewrite all nonssl requests to ssl. rewrite ^ https://$server_name$request_uri? permanent; } 

当我为* .mydomain.com做同样的事情时,它在逻辑上redirect到

 https://%2A.mydomain.com/ 

你如何将所有子域名redirect到他们的https等价物?

就这样…

 server { listen 80; server_name *.mydomain.com; #Rewrite all nonssl requests to ssl. return 301 https://$host$request_uri; } 

NGINX官方文档鼓励使用return指令,而不是使用rewrite指令来实现redirect。 这是这样的,因为重写的请求不是针对该服务器的,而是仍然在该服务器块中处理。 因此,redirect正确地使用return指令完成,因为所有的处理都被停止,并立即发送响应。 NGINX不鼓励在这里重写: http ://nginx.org/en/docs/http/converting_rewrite_rules.html

返回指令的语法是:返回码URL; 由于您原本正在进行永久性重写,因此您可以使用301作为响应的代码,表明它是永久redirect。 您的https地址将通过url部分传递。 参考: http : //nginx.org/en/docs/http/ngx_http_rewrite_module.html#return

所以你的正确configuration是

 server { listen 80; server_name *.mydomain.com; #Redirect all nonssl requests to ssl. return 301 https://$server_name$request_uri; } 

这可能会让你正确地redirect到你的SSL域,通配符服务器块。 您也可以按照上述注释中的build议尝试下划线通用服务器名称“_”或$ host。 让我们知道!

尝试这样的事情:

 server { listen 80; server_name ~^(.*)\.mydomain\.com$; set $servername $1; rewrite ^(.*)$ https://$servername.mydomain.com/$1; } 

问题的关键是定义通配符服务器,并根据其名称进行redirect。