我希望 Nginx 将访问者重定向到我的顶级域名上的 HTTPS,但不重定向某些子域名(因为我不想费心将子域名添加到我的证书中,而且这也不是必需的)。似乎正在发生的事情是,Nginx 正在将我的顶级域名以及所有子域名重定向到 HTTPS,尽管我只明确将重定向放在顶级域名的服务器块中。下面是我基本上这样做的方式:
server {
server_name example.com;
listen 80;
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
listen 443 ssl;
...
}
server {
server_name nossl.example.com;
listen 80;
}
当用户访问http://nossl.example.com,他们被迫使用 SSL (HTTPS),结果收到有关证书的警告。我怎样才能让它不这样做?
答案1
在 nginx SSL 配置上:
找到代码add_header Strict-Transport-Security
:
server {
listen 443 ssl;
server_name www.example.com;
....
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
}
请删除参数includeSubDomains
。正确的代码是:
server {
listen 443 ssl;
server_name www.example.com;
....
add_header Strict-Transport-Security "max-age=31536000;";
}
这不会在子域上应用 SSL。
答案2
这是我想出的丑陋解决方案。我添加了另一个服务器块https://nossl.example.com重定向至http://nossl.example.com。我认为应该有一个更优雅的解决方案。
server {
server_name example.com;
listen 80;
return 301 https://example.com$request_uri;
}
server {
server_name example.com;
listen 443 ssl;
...
}
server {
server_name nossl.example.com;
listen 80;
}
server {
server_name nossl.example.com;
listen 443 ssl;
return 301 http://nossl.example.com$request_uri;
}