SonkoDmitry
@SonkoDmitry
Веб разработчик

Хосты в nginx с ssl?

Есть сайт, на нем принудительно включен SSL, пример конфига:
server {
        listen 80 default_server;
        listen 443 default_server ssl;

        server_name www.site.com site.com;

        access_log /var/www/site.com/logs/nginx.access_log;
        error_log /var/www/site.com/logs/nginx.error_log;

        if ($scheme != 'https') {
                rewrite ^/(.*)$ https://$host/$1 permanent;
        }

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

        #fix for error 400 Bad Request\nThe plain HTTP request was sent to HTTPS port
        error_page 497 https://$host:443$request_uri;

       root /var/www/site.com/public_html;
       index index.html index.htm;

       ssl on;
       ssl_certificate /etc/nginx/ssl/site.com.compiled.crt;
       ssl_certificate_key /etc/nginx/ssl/site.com.key;

       #ssl_session_timeout 5m;

       #ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
       #ssl_ciphers "HIGH:!aNULL:!MD5 or HIGH:!aNULL:!MD5:!3DES";
       #ssl_prefer_server_ciphers on;

       location / {
               try_files $uri $uri/ =404;
                fastcgi_param  HTTPS on;
       }
}
Сертификат получен только на site.com. Хочется сделать еще второй хост, тестовый, вида dev.site.com
server {
        listen 80;

        server_name dev.site.com www.dev.site.com;

        access_log /var/www/dev.site.com/logs/nginx.access_log;
        error_log /var/www/dev.site.com/logs/nginx.error_log;

        if ($host != 'dev.site.com') {
                rewrite ^/(.*)$ http://dev.site.com/$1 permanent;
        }

#       error_page 497 http://$host$request_uri;

        root /var/www/dev.site.com/public_html;
        index index.html index.htm;

        location / {
               try_files $uri $uri/ =404;
        }
}
И вот начинаются проблему. При попытке зайти на тестовый хост, идет переадресация на основной и пытается отправить именно на https, в связи с чем вылетает свойственная nginx ошибка о попытке отправки незащищенного контента на защищенный хост. Можно ли каким образом сделать так, чтобы один хост работал только через ссл, соответсвенно перекидывал нерадивых туда сам, а второй, тестовый, только через http
  • Вопрос задан
  • 7363 просмотра
Решения вопроса 1
SonkoDmitry
@SonkoDmitry Автор вопроса
Веб разработчик
Получилось решить проблему примерно следующим конфигом:
site.com - онли хттпс
server {
        listen 80 default_server;
        server_name www.site.com site.com;
        access_log /var/www/site.com/logs/nginx.access_log;
        error_log /var/www/site.com/logs/nginx.error_log;

        return 301 https://site.com$request_uri;
}

server {
        listen 443 ssl;
        server_name www.site.com;
        access_log /var/www/site.com/logs/nginx.access_log;
        error_log /var/www/site.com/logs/nginx.error_log;

        ssl on;
        ssl_certificate /etc/nginx/ssl/site.com.compiled.crt;
        ssl_certificate_key /etc/nginx/ssl/site.com.key;

        return 301 https://site.com$request_uri;
}

server {
        listen 443 default_server ssl;
        server_name site.com;

        access_log /var/www/site.com/logs/nginx.access_log;
        error_log /var/www/site.com/logs/nginx.error_log;

        root /var/www/site.com/public_html;
        index index.html index.htm;

        ssl on;
        ssl_certificate /etc/nginx/ssl/site.com.compiled.crt;
        ssl_certificate_key /etc/nginx/ssl/site.com.key;

        location / {
                try_files $uri $uri/ =404;
                fastcgi_param  HTTPS on;
        }
}

и второй, тестовый хост
server {
        listen 443 ssl;
        server_name www.dev.site.com dev.site.com;
        access_log /var/www/dev.site.com/logs/nginx.access_log;
        error_log /var/www/dev.site.com/logs/nginx.error_log;

        return 301 http://dev.site.com$request_uri;
}

server {
        listen 80;
        server_name www.dev.site.com;
        access_log /var/www/dev.site.com/logs/nginx.access_log;
        error_log /var/www/dev.site.com/logs/nginx.error_log;

        return 301 http://dev.site.com$request_uri;
}

server {
        listen 80;
        server_name dev.site.com;

        access_log /var/www/dev.site.com/logs/nginx.access_log;
        error_log /var/www/dev.site.com/logs/nginx.error_log;

        root /var/www/dev.site.com/public_html;
        index index.html index.htm;

        location / {
                try_files $uri $uri/ =404;
        }
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Блоки с if{...} – зло. Чтобы только SSL и только без www, пропишите отдельными конфигами вспомогательные редиректы:
#   Ловит всех по http
server {
    listen 80;
    server_name    site.com  www.site.com;
    return 301 https://site.com$request_uri;
}

#   Только https, с лишним www.
server {
    listen 443 ssl;
    server_name    www.site.com;
    return 301  https://site.com$request_uri;
}


Аналогично для тестового пропишите.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы