ServerFault 上有很多问题涵盖了这个问题的部分内容,但我很难将它们拼凑在一起。我有一个新的 nginx 服务器,安装了 Wildcard SSL 证书。一切正常。我想创建强制执行以下内容的重定向规则:
1) 必须强制使用 www 或子域名。因此,subdomain.domain.com 和 www.domain.com 都可以。domain.com 本身不可以,应该自动添加 www。
2)整个网站都必须强制使用 HTTPS,无论子域名是什么。
换句话说:
ttp://域名.com >> ttps://www.域名.com
ttp://subdomain.domain.com >> ttps://subdomain.domain.com
ttps://域名.com >> ttps://www.域名.com
ttps://subdomain.domain.com (这样就可以)
根据 Nginx 重写陷阱页面和本网站上的其他答案,我一直在使用这个配置代码:
server {
listen 80;
server_name *.domain.com;
return 301 https://$server_name$request_uri;
}
还有这个:
server {
listen 80;
server_name ~^(.*)domain\.com;
return 301 https://$server_name$request_uri;
}
我也尝试过使用$host而不是$server_name。
所有这些都很好地重定向了 http > https,但它始终默认为https://domain.com,无论子域名还是 www。有什么想法?
答案1
今天早上我又花了几个小时才找到答案。您需要两个额外的服务器块:一个用于强制执行 www,一个用于强制执行 https,同时保留通配符子域。以下是代码:
server {
listen 80;
listen 443;
server_name domain.com;
return 301 https://www.domain.com$request_uri;
}
server {
listen 80;
server_name ~^(?<subdomain>.+)\.domain\.com$;
return 301 https://$subdomain.domain.com$request_uri;
}
server {
listen 443 default_server;
listen [::]:433 default_server ipv6only=on;
... the rest of your HTTPS server configuration goes here ...
第一个块查找 no-www,无论它是 HTTP 还是 HTTPS。这会重定向到 www.domain.com,这很容易。第二个块使用正则表达式将子域放入变量中,然后返回到相同的子域 + 域,只是带有 https。之后,第三个块可以包含常规服务器配置。
希望能帮助到你!
答案2
在我看来,您明确将其转发到 domain.com。您是否尝试过在 https:// 和 $server_name 之间添加 www?我就是这么做的,而且我有一个教程关于这种事情。示例配置文件可能会有用。
server {
listen 80;
server_name *.domain.com;
return 301 https://www.$server_name$request_uri;
}
报告其运作情况,我们可以根据需要进行调整。