将通配符子域重定向到https(nginx)


20

我已经获得了通配符ssl认证,并且正在尝试将所有非ssl流量重定向到ssl。目前,我正在使用以下内容重定向正常工作的非子域化的url。

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}

当我对* .mydomain.com做同样的事情时,它在逻辑上重定向到

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

您如何将所有子域重定向到它们的https等效项?


2
为什么不使用$ host而不是$ server_name?
cjc 2012年

Answers:


47

就这样...

server {
    listen      80;
    server_name *.mydomain.com;

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}

2
多一点解释可能会使这个问题更好。
Dave M

3
@dave -m,需要解释吗?$host变量?$request_uri
cadmi

它不起作用,仍然显示https://%2A.handy.travel/
戴蒙·袁

2

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

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

所以你的正确配置是

server {
listen      80;
server_name *.mydomain.com;

#Redirect all nonssl requests to ssl.
return 301 https://$server_name$request_uri;
}

这可能使您可以使用通配符服务器块将其正确重定向到ssl域。您也可以尝试使用下划线的通用服务器名称'_'或$ host,如上面的注释中所建议。让我们知道!


虽然return通常使用更好,但建议的配置是不正确的,因为它仍使用$ server_name进行重定向,即“ * .mydomain.com”。@cjc在上面的注释中已经概述了正确的解决方案- $host应该使用而不是$server_name
Maxim Dounin 2012年

是的,同意。看来我的注意力跨度很冷淡!
Apurva Sukant 2012年

代替上面的干扰,请允许我为您提供有关ssl配置的提示,该提示应可以显着提高性能。如果使用通配符证书,则设置SSL的最有效方法是设置“ ssl装订”。这允许您在默认服务器上为所有子域设置一次SSL,并为每个子域保存单独的ssl身份验证。ssl_stapling on; 解析器8.8.8.8; ssl_stapling_file /ssl_keys/example.com_staple; ssl_stapling_verify on; 参考-calomel.org/nginx.html
Apurva Sukant 2012年

2
应该是return 301 https://$host$request_uri;
scarver2

我正在侦听端口80、8080和8181,return 301 https://$server_name$request_uri;以使其在端口443上使用https。问题是重定向的URL仍然具有原始端口号。80不是问题,但是8080的出现是https://example.com:8080
A.Grandt

-1

尝试这样的事情:

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

要抓住的是定义通配符服务器并根据其名称进行重定向。


正则表达式组过于宽松。
喀什
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.