我有一个通配符 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;
}
关键在于定义通配符服务器并根据其名称进行重定向。