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

мой сертификат ssl работает только с www.example.com, а не с example.com

Я приобрел сертификат, действительный как для www.example.com, так и для example.com. Мой сервер работает только с «www.example.com» (ssl работает нормально), но он вообще ничего не показывает, когда я набираю «example.com» в браузере. Вот моя конфигурация файла apache, которая в основном является одним и тем же виртуальным хостом дважды, но с другим именем сервера

Define APACHE_LOG_DIR /var/log/apache2
Define SSLCERTIFICATE /etc/apache2/ssl/mycertificate.crt
Define SSLKEY /etc/apache2/ssl/mykey.key
<IfModule mod_ssl.c>
        <VirtualHost *:443>
                ServerAdmin admin@example.com
                ServerName www.example.com

                DocumentRoot /var/www/site2/

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile ${SSLCERTIFICATE}
                SSLCertificateKeyFile ${SSLKEY}

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                <Directory />
                        Options FollowSymLinks
                        AllowOverride All
                </Directory>
                <Directory "/var/www/site2">
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride All
                        Order Allow,Deny
                        Allow from all
                </Directory>


                BrowserMatch "MSIE [2-6]" \
                                nokeepalive ssl-unclean-shutdown \
                                downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        </VirtualHost>

        # Same documetn root for example.com (without www)
        <VirtualHost *:443>
                ServerAdmin admin@example.com
                ServerName example.com

                DocumentRoot /var/www/site2/

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                SSLEngine on

                SSLCertificateFile ${SSLCERTIFICATE}
                SSLCertificateKeyFile ${SSLKEY}

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                SSLOptions +StdEnvVars
                </FilesMatch>
                <Directory /usr/lib/cgi-bin>
                                SSLOptions +StdEnvVars
                </Directory>

                <Directory />
                        Options FollowSymLinks
                        AllowOverride All
                </Directory>
                <Directory "/var/www/site2">
                        Options Indexes FollowSymLinks MultiViews
                        AllowOverride All
                        Order Allow,Deny
                        Allow from all
                </Directory>


                BrowserMatch "MSIE [2-6]"                                 nokeepalive ssl-unclean-shutdown                                 downgrade-1.0 force-response-1.0
                # MSIE 7 and newer should be able to use keepalive
                BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

        </VirtualHost>
</IfModule>

Дополнительная информация:

Причина, по которой вы не видите версию без www, заключается в том, что вы используете два подстановочных знака для IP *:443 с двумя разными доменными именами. Apache просто использует первый, с которым будет использоваться сертификат. Из документации Apache [1]:

Проблема с использованием именованных виртуальных хостов через SSL заключается в том, что именованные виртуальные хосты полагаются на знание того, какое имя хоста запрашивается, и запрос не может быть прочитан, пока не будет установлено SSL-соединение. Таким образом, обычным поведением является то, что соединение SSL устанавливается с использованием конфигурации виртуального хоста по умолчанию для адреса, по которому соединение было получено.

Чтобы использовать подстановочный знак, вам понадобится один IP-адрес на сертификат. Каждый виртуальный IP-адрес будет использоваться Apache для перенаправления входящего зашифрованного SSL-запроса. Для этого:

  1. Добавьте виртуальный IP в интерфейс (если мы предполагаем, что это eth0, добавьте к нему псевдоним)
  2. Обновите файл ports.conf, добавьте две записи:
    • ИмяVirtualHost IP1: 443
    • ИмяVirtualHost IP2: 443
  3. Обновите свой vHost, чтобы он выглядел так:

    Сайт с www

    ServerName www.site.com

    Сайт без www

    ServerName site.com

РЕДАКТИРОВАТЬ
Вы также можете перенаправлять все входящие обращения с site.com на www.site.com. Для этого удалите vHost для site.com и добавьте следующую строку: ServerAlias ​​site.com

Это даст указание Apache использовать один и тот же vHost для обоих доменов. Если вы хотите перенаправить все входящие обращения (http://example.com, и http://www.example.com) в основной защищенный домен (https://www.example.com) рассмотрите возможность добавления следующей инструкции:

RewriteEngine On
RewriteCond %{HTTPS} off
# Don't put www. here. If it is already there it will be included, if not
# the subsequent rule will catch it.
RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

site.com заменен на example.com согласно правилам Serverfault

[1]https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI

Поскольку ваш сертификат действителен для обоих example.com и www.example.com, и оба домена настроены на использование одних и тех же каталогов, я не вижу причин для их использования как отдельных VirtualHosts. Я бы удалил второй VirtualHost и изменил первый, чтобы он выглядел так:

   <VirtualHost *:443>
            ServerAdmin admin@example.com
            ServerName www.example.com
            ServerAlias example.com

[the rest of the config should look the same as it does in your post]

    </VirtualHost>

Если вы хотите использовать SNI, вы должны включить его. Проверьте, если

ИмяVirtualHost *: 443

доступен где-то в вашей конфигурации

Но я думаю, что лучше добавить serverAlias ​​и тот же корневой каталог. Вы можете выбрать разницу с помощью mod_rewrite.

Наконец-то мне удалось сделать что-то вроде Дженни Д предлагает, а также перенаправляет с mypage.com к www.mypage.com и изменив имя CName www в конфигурации goDaddy (где находится мой домен), чтобы указать адрес моей виртуальной машины Azure.

Следовательно, в этом случае не требовалось ни изменять файл .htaccess, ни использовать SNI. Не уверен, лучшая это конфигурация или идеальная, но, по крайней мере, работает.