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

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

我有一个通配符 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 等效域名?

答案1

就这样...

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

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

答案2

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

return 指令的语法是:return code 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,如上面的评论中所建议。让我们知道!

答案3

尝试这样的操作:

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

关键在于定义通配符服务器并根据其名称进行重定向。

相关内容