Nginx&Httpsredirect

我有一个www.domain.com的SSL证书。 很显然,如果有人去https://domain.com,他们会从浏览器中得到关于证书不匹配的错误。 是否可以设置Web服务器将请求从https:// domain.comredirect到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点击网站,这不是一个问题,我已经可以redirect到https:// www.domain.com,这是正确的。 只有他们手动键入https:// domain.com,我不知道如何做redirect。

不幸的是,redirect响应只能在SSL会话build立才能发生。

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

 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 } 

编辑:如何在您的SSL证书添加domain.com作为SubjectAltName,所以你不必重写。 也许问你的CA是否有可能?

最坏的情况下,将证书的$ $$授予domain.com:D

我使用这个将用户推送到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; } } 

最后一个必须定义,否则其他子域将不起作用。

还有另一个例子,如何处理那些没有Host: header行的人:

 server { listen 80 default; server_name _; server_name_in_redirect off; root /var/www/jail/; index index.html; } 

作为便笺,您可以为通配DNS名称创build证书。 这些被称为“野生证书”,即使它们是有效的,Firefox用户仍然会收到警告。