我有 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 用户仍会收到警告。