Я бы хотел, чтобы 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) и, как следствие, получают неприятное предупреждение о сертификате. Как я могу этого не делать?
В конфигурации 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 к поддомену.
Это уродливое решение, которое я придумал. Я добавил еще один серверный блок для 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;
}