Перенаправления Nginx: принудительное использование поддоменов и SSL
Есть много вопросов по ServerFault, которые охватывают части этого вопроса, но мне трудно собрать их вместе. У меня есть новый сервер nginx с установленным сертификатом Wildcard SSL. Все это прекрасно работает. Я хотел бы создать правила перенаправления, которые обеспечивают следующее:
1) Должен быть установлен либо www, либо поддомен. Итак, subdomain.domain.com и www.domain.com - это хорошо. domain.com сам по себе не является, и должен автоматически добавить www.
2) HTTPS должен применяться по всему сайту, независимо от субдомена.
Другими словами:
ttp: //domain.com >> ttps: //www.domain.com
ttp: //subdomain.domain.com >> ttps: //subdomain.domain.com
ttps: //domain.com >> ttps: //www.domain.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. Мысли?
2 ответа
Я нашел ответ, потратив на это еще несколько часов этим утром. Вам нужны два дополнительных серверных блока: один для принудительного использования 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. После этого третий блок может содержать обычную конфигурацию сервера.
Надеюсь, поможет!
Мне кажется, что вы эксплицируете его на domain.com. Вы пытались добавить www между https:// и $server_name? Это то, что я делаю, и у меня есть учебник по этому вопросу. Образцы конфигурационных файлов могут быть полезны.
server {
listen 80;
server_name *.domain.com;
return 301 https://www.$server_name$request_uri;
}
Сообщите, как это работает, мы можем настроить его по мере необходимости.