Назад | Перейти на главную страницу

Перенаправления 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. Мысли?

Я нашел ответ, потратив на это еще несколько часов сегодня утром. Вам понадобятся два дополнительных серверных блока: один для принудительного использования 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 ...

Первый блок ищет без www, независимо от того, HTTP это или нет. Это достаточно просто перенаправляет на 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;
}

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