Как на NGINX сделать «http to https» и «www to non-www» сразу для пары доменов?

Доброго времени суток специалистам!

Буду очень признателен, если подскажите мне правильную последовательность действий:
В связи с тем, что сайт мультиязычный, есть пара доменов.
Мне нужно для сделать следующее:
1) чтобы оба домена всегда работали только через HTTPS
2) всегда были без WWW

Я правильно понимаю, мне сначала надо создать сервер на 80 порту, в server_name прописать все возможные домены с www и без-www

1) После чего реализовать редирект на HTTPS
2) HTTPS прописать проверку на наличие www и если есть, то кидать на https без www.

Я правильно мыслю?

С этим конфигом у меня на данный момент происходит "This webpage has a redirect loop".
## our http server at port 80
server {
      listen      80 default;
      server_name domain.ru www.domain.ru domain.com www.domain.com;
      ## redirect http to https ##
      rewrite        ^ https://$server_name$request_uri? permanent;
}

## Our https server at port 443. You need to provide ssl config here###
server {
listen    443 ssl;
server_name domain.ru www.domain.ru domain.com www.domain.com;

server_name "~^www\.(.*)$";
return 301 https://$host$request_uri;
}
  • Вопрос задан
  • 16374 просмотра
Решения вопроса 1
kompi
@kompi
nullstack devoops
А если так попробовать:
server {
    listen              80;
    server_name "~^(www\.)?(.*)$" ;
    return 301 https://$2$request_uri ;
}
server {
    listen              443 ssl;
    server_name "~^www\.(.*)$" ;
    return 301 https://$1$request_uri ;
}
server {
    listen              443 ssl;
    server_name domain.ru domain.com;
    # основная секция
}

Для особых извращенцев:
server {
    listen              80;
    listen              443 ssl;
    server_name server_name "~^(www\.)?(.*)$";
	if($scheme = https) {
		if($1 = www) {
			return 301 http://$2$request_uri;
	    }
    }
	if($scheme = http) {
		return 301 http://$2$request_uri;
	}
    # основная секция
}

По-хорошему, регулярок не должно быть. Если это два разных сайта, то лучше разделить конфиги, если это зеркало и основной, то в return прописать основной и убрать регулярки.
server {
    listen              80;
    server_name www.domain.com domain.com;
    return 301 https://domain.com$request_uri ;
}
server {
    listen              80;
    server_name www.domain.ru domain.ru;
    return 301 https://domain.ru$request_uri ;
}
server {
    listen              443 ssl;
    server_name www.domain.ru;
    return 301 https://domain.ru$request_uri ;
}
server {
    listen              443 ssl;
    server_name www.domain.com;
    return 301 https://domain.com$request_uri ;
}
server {
    listen              443 ssl;
    server_name domain.ru domain.com;
    # основная секция
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
merryjane
@merryjane
Системный администратор
Не надо делать так, чтобы домен проходил два реврайта. Набранный в адресной строке домен должен в один реврайт перенаправляться на целевой домен.

Например, все http с www можно завернуть на https без www так:
server {
listen 80;
server_name "~^www\.(.*)$" ;
return 301 https://$1$request_uri ;
}
Ответ написан
Комментировать
inside22
@inside22 Автор вопроса
@kompi
domain.com - это англоязычная версия сайта
www.domain.com - это ALIAS англоязычной версии

domain.ru - это русскоязычная версия сайта
www.domain.ru - это ALIAS русскоязычной версии

@merryjane по идеи два раза через реврайт проходить не будет.
если клиент зашел на www.domain.com или на domain.com
то его по любому редиректит на https://domain.com

если он вдруг своими пытливыми ручками наберет в браузере https://www.domain.com то сработает второе правильно и клиент полетит на https://domain.com
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы