nginx HTTPS WWW перенаправить на не-WWW

Мой SSL-сертификат предназначен для mydomain.com, поэтому я пытаюсь перенаправить все www.mydomain.com без www. Теперь все эти работы:

http://www.mydomain.com
http://mydomain.com
https://mydomain.com

но https://www.mydomain.com/ выдает браузеру предупреждение "Сайт небезопасен"... Я попытался настроить перенаправление, как показано ниже, но, пожалуйста, скажите, где мой скрипт глючит...

     server {
        listen      80;
        server_name www.mydomain.com mydomain.com;
        rewrite     ^(.*)   https://mydomain.com$1 permanent;
        client_max_body_size 100M;
            location / {
                   index    index.htm index.html index.php;
            }

            location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
            }


    }



    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;


        server_name www.mydomain.com;
        rewrite ^(.*) https://mydomain.com$1 permanent;

    }





    server {
        listen               443;
        ssl                  on;
        ssl_certificate      /usr/local/nginx/conf/public.crt;
        ssl_certificate_key  /usr/local/nginx/conf/server.key;
        client_max_body_size 100M;
        server_name mydomain.com;
        root /var/www/mysite;
        index index.php;

        location ~ \.php$ {
                    include fastcgi_params;
                    fastcgi_index index.php;
                    fastcgi_pass 127.0.0.1:9000;
                    fastcgi_param SCRIPT_FILENAME /var/www/mysite$fastcgi_script_name;
        }


    }

3 ответа

Ваш конфигурационный скрипт не глючит.

С вашей текущей конфигурацией (при условии, что у вас установлен стандартный отдельный субъектный SSL-сертификат), это не вариант.

Причина этого в том, как работают соединения https:

Когда клиент (браузер) отправляет запрос https на сервер (nginx), он инициирует сеанс SSL посредством рукопожатия SSL. Когда и только когда рукопожатие завершается успешно и сеанс установлен, браузер отправляет фактический HTTP-запрос, содержащий имя хоста. Поскольку SSL/TLS - это не только способ обеспечить шифрование для соединений данных, но и способ для сервера аутентифицировать себя для клиента. В рамках процесса аутентификации браузер проверяет подлинность сервера. Одной из проверок проверки является сопоставление имени субъекта сертификата с именем хоста, с которого браузер намеревается запрашивать контент. Если эта проверка не пройдена, браузер выдает предупреждение пользователю.

Поскольку процесс проверки завершается неудачно, сервер никогда не получает HTTP-запрос для www.mydomain.com на порт 443 прослушивателя и, таким образом, не может отправить ответ перенаправления клиенту / браузеру.

Чтобы включить перенаправление с https://www.mydomain.com/ на https://mydomain.com/, у вас есть несколько вариантов, но все сводится к следующему: вам необходим сертификат с темой для каждого имени хоста.

  1. Сертификат SAN

    • Получите сертификат UC/SAN и добавьте www.mydomain.com в качестве SAN (Subject Alternate Name)
    • Субъекты теперь соответствуют запросам для обоих mydomain.com а также www.mydomain.com
  2. Несколько IP-адресов

    • Получите другой IP-адрес для вашего сервера.
    • Получить сертификат SSL с именем субъекта www.mydomain.com
    • Настройте www.mydomain.com HTTPS server прослушивать новый IP-адрес (по-прежнему порт 443)
    • Настройте www.mydomain.com HTTPS server использовать новый сертификат
    • Обновите запись A для www.mydomain.com, указав новый IP-адрес в общедоступной зоне DNS.
  3. TLS SNI

    • Как и в приведенном выше примере, получить сертификат SSL с именем субъекта www.mydomain.com
    • Вместо использования другого IP-адреса воспользуйтесь расширением TLS с указанием имени сервера.

Поскольку SNI имеет ограниченную поддержку браузера, я бы не стал предлагать 3. Ознакомьтесь с документацией nginx по SNI, если хотите (внизу страницы)

ОБНОВЛЕНИЕ: Некоторые центры сертификации предлагают сертификаты одного субъекта с бесплатным дополнительным SAN для www. префикс.

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

Если ваш сертификат недействителен для "www.example.com", а действителен только для "example.com", вы не сможете перенаправить с https://www.example.com/ на https://example.com/ без предупреждение безопасности.

Вы можете попробовать это:

server {    
        listen 443;
        server_name  www.domain.com;
        return 301 https://domain.com$request_uri;
}

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

Другие вопросы по тегам