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

nginx перенаправление https 443 без поддомена на поддомен www

Моя конфигурация:

server {
  listen 80;
  server_name mydomain.com;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

server {
  listen 80;
  server_name www.mydomain.com;
  return 301 https://www.mydomain.com$request_uri;

  if ($host !~* ^(www.mydomain.com)$ ) {
    return 444;
  }
}

server {
  listen 443;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;

  ...
}

какой работает:

какой не работает правильно:

Какое решение для https://mydomain.com проблема выше?

Используйте оператор if в блоке вашего сервера SSL, чтобы проверить хост:

server {
  listen 443;
  server_name www.mydomain.com mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;



  if ($host = 'mydomain.com' ) {
     rewrite  ^/(.*)$  https://www.mydomain.com/$1  permanent;
  }

  ...
}

Я предпочитаю избегать, потому что если зло, также я предпочитаю использовать возврат вместо перезаписи, потому что для этого не нужно запускать механизм регулярных выражений.

server {
  #default server that catches all undefined host names
  listen 80 default_server;
  return 444;
}
server {
  #redirecting server for non-www ssl and non ssl domains
  listen 80;
  liste 443 ssl;
  server_name mydomain.com;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  return 301 https://www.mydomain.com$request_uri$is_args$query_string;
}
server {
  # redirecting server for www non ssl server
  listen 80; 
  server_name www.mydomain.com;
  return 301 https://mydomain.com$request_uri$is_args$query_string;
}
server {
  # main server config
  listen 443 ssl;
  server_name www.mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  # remaining config...
}

Как я и подозревал, причина была в том, что порт 80 был пропущен, а порт 443 получен напрямую. Добавление следующего server блок включил перенаправление:

server {
  listen 443;
  server_name mydomain.com;
  ssl on;
  ssl_certificate     /path/to/www.mydomain.com_chain.pem;
  ssl_certificate_key /path/to/www.mydomain.com.key;
  rewrite ^(.*)$ $scheme://www.mydomain.com$1;
}

Если кто-то знает лучшее или более элегантное решение, добавьте свой ответ.