Перенаправления 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;
}

Сообщите, как это работает, мы можем настроить его по мере необходимости.

Другие вопросы по тегам