我使用的是 Ubuntu 14.04,安装了 nginx,并在主域上安装了 SSL,运行良好。我甚至在主域上停放了 5-6 个其他域。如果我访问其中任何一个域,我都会收到 SSL 警告,因为我已使用以下配置在 nginx 配置中强制使用 HTTPS:
我已经添加了以下内容/etc/nginx-sp/vhosts.d/APPNAME.d/redirect_to_https.nonssl_conf
return 302 https://$host$request_uri;
这正确地强制提供 HTTPS 版本。
我如何实现某些条件,例如:如果域名是main.example.com
则重定向到 HTTPS 版本,否则显示 HTTP 版本?
答案1
任何尝试创建if
语句来返回站点的 https 版本的尝试都将导致重定向循环(因为您的条件server_name
在重定向后不会改变,所以总是会匹配条件并再次重定向...)。
话虽如此,我建议为每个虚拟主机/子域设置单独的配置文件(我从您当前的设置推断,您使用的是单个 catch-all 配置 - 如果不是这种情况,请相应地更新您的问题)
您可能还会发现以下一种更优雅的方式,可以在您希望始终通过 https 提供服务的域/子域上重定向到 https:
if ( $scheme = http ){
rewrite ^ https://$server_name$request_uri? permanent;
}
例如,您可以创建以下内容:
server {
server_name nonssldomain.com anothernonssldomain.com;
listen 80;
}
在一个名为 non_ssl_sites.conf (或任何你喜欢的)的文件中,然后是另一个:
server {
server_name ssldomain.com;
listen 80;
listen 443 ssl;
if ( $scheme = http ){
rewrite ^ https://$server_name$request_uri? permanent;
}
}
在名为 ssl_sites.conf 的文件中(或者,无论您喜欢什么)
答案2
您应该为您管理的每种“类型”的域使用不同的服务器块,这样您就不必使用 if 语句来测试 $host 变量。
# Domains to serve only via HTTPS
server {
server_name domaintoredirect1.tld domaintoredirect2;
listen 80;
return 302 https://$host$request_uri;
}
server {
server_name domaintoredirect1.tld domaintoredirect2;
listen 443 ssl;
...
}
# Domains to serve via both HTTP/HTTPS
server {
listen 80;
listen 443 ssl;
server_name otherdomain1.tld otherdomain2.tld;
}