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

wha*_*hat 22 nginx https

我有一个通配符 ssl 认证,我正在尝试将所有非 ssl 流量重定向到 ssl。目前,我正在使用以下内容重定向工作正常的非子域 url。

server {
listen      80;
server_name mydomain.com;

#Rewrite all nonssl requests to ssl.
rewrite     ^ https://$server_name$request_uri? permanent;
}
Run Code Online (Sandbox Code Playgroud)

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

https://%2A.mydomain.com/
Run Code Online (Sandbox Code Playgroud)

你如何将所有子域重定向到它们的 https 等价物?

cad*_*dmi 55

就这样...

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

     #Rewrite all nonssl requests to ssl.
     return 301 https://$host$request_uri;
}
Run Code Online (Sandbox Code Playgroud)

  • @dave-m,需要解释一下吗?`$host` 变量?`$request_uri`? (3认同)
  • 多一点解释可能会使这是一个更好的答案。 (2认同)

Apu*_*ant 3

NGINX 官方文档鼓励使用 return 指令而不是使用 rewrite 指令来实现重定向。之所以如此,是因为被重写的请求并不适用于该服务器,但它仍然在该服务器块中得到处理。因此,可以使用 return 指令正确完成重定向,因为所有处理都会停止并立即发送响应。NGINX 不鼓励在这里重写重定向: 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;
}
Run Code Online (Sandbox Code Playgroud)

这可能会让您使用通配符服务器块正确重定向到您的 ssl 域。您还可以按照上面评论中的建议尝试使用下划线通用服务器名称“_”或 $host。让我们知道!

  • 应该是`return 301 https://$host$request_uri;` (3认同)