Nginx +пользовательские поддомены, редирект на https и www vs no-www

DK
На сайте с 06.09.2014
Offline
0
5007

Здравствуйте, столкнулся с проблемой редиректа. На сервере по средствам фреймворка, для пользователей создаются поддомены вида user.example.com. Т.к. пользователей много то, для отлавливания этих поддоменов в переменную server_name и обрезания www используется регулярное выражение, в общем, у меня не выходит правильно вернуть адрес. Как хотелось бы, чтобы оно заработало:

Если пользователь вводит адрес типа (https://) http://www.user.example.com его должно редиректить на https://user.example.com

А при обращении к (https://) http://www.example.com перенаправляло на https://examle.com, а не на страницу несуществующего пользователя www.

Привожу свой конфиг, до настройки SSL он справлялся со своей задачей.

SSL должен работать на всех поддоменах подписан он для *.example.com

server {

server_name www.example.com;

return 301 $scheme://example.com$request_uri;

}

server {

listen 80 ;

server_name ~^www\.(\w+\.example\.com)$;

return 301 http://$1$request_uri;

}

server {

server_name example.com ~^\w+\.example\.com$;

root /var/www/htdocs/;

index index.php;

include /etc/nginx/templates/default;

include /etc/nginx/templates/php;

}

-----

Пробовал изменить конфиг, www обрезается и добляется hhtps:// , но теперь если зайти на (http, https) user.example.com в адресе появляется правильный адрес вида https://user.example.com , но в итоге отображается главная страница сайта example.com, а не страница пользователя:

server {

listen 80;

server_name "~^(www\.)?(.*)$" ;

return 301 https://$2$request_uri ;

}

server {

listen 443 ssl;

server_name example.com; # По всей видимости, здесь должно быть что-то другое.

keepalive_timeout 60;

ssl_certificate example.crt;

ssl_certificate_key privatkey.key;

ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

ssl_ciphers "RC4:HIGH:!aNULL:!MD5:!kEDH";

add_header Strict-Transport-Security 'max-age=604800';

...}

Если изменить первую часть конфига, то www не обрезается, и не добавляется https, зато отображается страничка пользователя на его личном поддомене.

server {

listen 80 default_server;

server_name ~^www\.(\w+\.example\.com)$;

return 301 https://example.com$request_uri;

}

Andreyka
На сайте с 19.02.2005
Offline
822
#1

Создаете конфиг для www.*.example.com

В нем берете регексп по вилдкарду и делаете регидект на $1.example.com

А для www.example.com ставьте еще один конфиг, который будет редиректить на example.com

Не стоит плодить сущности без необходимости
DK
На сайте с 06.09.2014
Offline
0
#2

Спасибо Андрей за наводку, к сожалению пока что не удалось настроить всё, ещё и браузер запоминает редирект, тяжело его сбросить.

Пока что дошёл до такого конфига вроде адрес в адресной строке изменятся, и добавляется префикс https, но отображается главная страница example.com вместо страницы пользователя.

server {

server_name www.example.com;

return 301 $scheme://example.com$request_uri;

}

server {

listen 80;

server_name ~^www\.(\w+\.example\.com)$; ( пробовал разные регулярки в них я не разбираюсь к сожалению "~^www\.(.*)$" "~^(www\.)?(.*)$" )

return 301 $scheme://$1.example.com; (return 301 https://1$.example.com)

}

server {

listen 443 ssl;

server_name example.com; (www.*example.com , *.example.com) пробовал разные варианты

keepalive_timeout 60;

ssl_certificate example.crt;

......

}

Andreyka
На сайте с 19.02.2005
Offline
822
#3

http://rubular.com/ - тут можно протестировать свои регулярки

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий