Nginx:如何重定向到 https,但不适用于子域

Pat*_*eld 6 nginx

我希望 Nginx 将访问者重定向到我的顶级域上的 HTTPS,但不适用于某些子域(因为我不想费心将子域添加到我的证书中,而且无论如何都不需要)。似乎正在发生的事情是 Nginx 重定向到我的顶级域以及所有子域上的 HTTPS,尽管我只是明确地将重定向放在顶级域的服务器块中。下面基本上是我这样做的方式:

server {
  server_name example.com;
  listen 80;
  return 301 https://example.com$request_uri;
}

server {
  server_name example.com;
  listen 443 ssl;
  ...
}

server {
  server_name nossl.example.com;
  listen 80;
}
Run Code Online (Sandbox Code Playgroud)

当用户访问http://nossl.example.com 时,他们被迫使用 SSL (HTTPS) 并因此收到有关证书的丑陋警告。我怎么能让它不这样做?

Pat*_*eld 0

这是我想出的丑陋的解决方案。我为https://nossl.example.com添加了另一个服务器块,该服务器块重定向到http://nossl.example.com。我认为应该有一个更优雅的解决方案。

server {
  server_name example.com;
  listen 80;
  return 301 https://example.com$request_uri;
}

server {
  server_name example.com;
  listen 443 ssl;
  ...
}

server {
  server_name nossl.example.com;
  listen 80;
}

server {
  server_name nossl.example.com;
  listen 443 ssl;
  return 301 http://nossl.example.com$request_uri;
}
Run Code Online (Sandbox Code Playgroud)