Я приобрел сертификат, действительный как для 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-запроса. Для этого:
ports.conf
, добавьте две записи: Обновите свой 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
Поскольку ваш сертификат действителен для обоих 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. Не уверен, лучшая это конфигурация или идеальная, но, по крайней мере, работает.