Nginx:如何重定向到 https,但不重定向到子域名

Nginx:如何重定向到 https,但不重定向到子域名

我希望 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;
}

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

答案1

在 nginx SSL 配置上:

找到代码add_header Strict-Transport-Security

server {
    listen 443 ssl;
    server_name www.example.com;
    ....
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
}

请删除参数includeSubDomains。正确的代码是:

server {
    listen 443 ssl;
    server_name www.example.com;
    ....
    add_header Strict-Transport-Security "max-age=31536000;";
}

这不会在子域上应用 SSL。

答案2

这是我想出的丑陋解决方案。我添加了另一个服务器块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;
}

相关内容