Nginx 和 Https 重定向

Nginx 和 Https 重定向

我有 www.domain.com 的 SSL 证书。显然,如果有人访问 https://domain.com,他们会从浏览器收到证书不匹配的错误。是否可以设置 Web 服务器以将请求从 https:// domain.com 重定向到 https:// www.domain.com?

在 nginx 中,我一直在尝试这种变体,但无济于事:

server {
  listen   443;
  server_name www.domain.com domain.com;
  if ($host !~ www.domain.com) {
    rewrite ^/(.*) https://www.domain.com/$1 permanent;
  }
}

编辑:只是想澄清一下,如果有人通过纯 http 访问该网站,这不是问题,我已经可以将他们重定向到 https:// www.domain.com,这是正确的。只有当他们手动输入 https:// domain.com 时,我才不知道如何进行重定向。

答案1

不幸的是,重定向响应只能发生SSL 会话已建立。

www.domain.com这显然是证书问题;您需要一个包含SAN(主体备用名称)的证书domain.com。大多数 CA 都会免费提供单个 SAN,例如 digicert。

答案2

server {
 listen 443;
 servername www.domain.com domain.com;

 if ($host ~ ^(?!www)) {
        rewrite ^/(.*)$ http://www.$host/$1 permanent;
    }
}

再想想,使用两个服务器块可能会更好:

server {
    listen 443;
    server_name  domain.com;
    rewrite ^(.*) http://www.example.com$1 permanent;
}

server {
    listen 443; 
    server_name  www.domain.com;
    hosting configuration here
}

编辑:将 domain.com 添加为 SSL 证书中的 SubjectAltName 怎么样,这样您就不必重写了。也许可以询问您的 CA 是否可行?

最糟糕的情况是,花 $$ 来获得 domain.com 的证书 :D

答案3

我使用它将用户推送到 https 服务:

server {
  listen 80;
  server_name mail.polemon.org;
  rewrite ^(.*)$ https://mail.polemon.org$1 permanent;
}

这是一条包罗万象的规则:

server {
  listen 80;
  server_name polemon.org *.polemon.org;

  if ($host != polemon.org) {
    rewrite ^(.*)$ http://polemon.org$1 permanent;
  }
}

必须最后定义 catch-all,否则其他子域将无法工作。

这是另一个示例,如何处理没有Host:标题行的人:

server {
  listen 80 default;
  server_name _;
  server_name_in_redirect off;

  root /var/www/jail/;
  index index.html;
}

附注:您可以为通配符 DNS 名称创建证书。这些证书称为“通配符证书”,即使它们有效,Firefox 用户仍会收到警告。

相关内容