Https для http перенаправления только для одного из нескольких сайтов на одном сервере
У меня есть несколько сайтов на одном сервере и сертификат SSL.
Проблема в том, что мне нужно перенаправить все сайты с https
в http
кроме одного, который должен быть единственным сайтом, использующим https
, Сказать, https-subsite.mainsite.ru
например.
На этом сайте есть несколько ссылок, которые появляются в поисках сайтов, которые не следует использовать https
, лайк https://https-subsite.mainsite.ru?eee=11&sd=1
а также https://other-non-https.mainsite.ru
например), которые следуют в никуда.
Я думаю, что они следуют к порту 443, который имеет DocumentRoot для 443 /var/www/blah/data/www/https-subsite.mainsite.ru
- его DocumentRoot только для одного сайта, который должен использовать https. (См. Конфигурацию ниже.)
Я попытался перенаправить один сайт с https на http вручную, например так:
<VirtualHost *:443 >
ServerName other-non-https.mainsite.ru
ServerAlias *.other-non-https.mainsite.ru
Redirect 301 / other-non-https.mainsite.ru
</VirtualHost>
и это работает, так что https://other-non-https.mainsite.ru
идет к http://other-non-https.mainsite.ru
и все ок. Я могу скопировать это для других сайтов, но кажется плохой идеей.
Есть ли другой, лучший способ перенаправить не https-сайты на их http-адреса? (Как и с одним правилом, а не с отдельным виртуальным хостом для каждого сайта.)
Мой httpd.conf:
<Directory /var/www/blah/data/www/mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/https-subsite.mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/other-non-https.mainsite.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
<Directory /var/www/blah/data/www/othernonhttps.ru>
Options -ExecCGI -Includes
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_flag engine on
</Directory>
NameVirtualHost *:80
NameVirtualHost *:443
#first site with https
<VirtualHost *:443 >
SSLCertificateChainFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.bundle
SSLCertificateFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.crt
SSLCertificateKeyFile /var/www/httpd-cert/blah/https-subsite.mainsite.ru.key
SSLEngine on
ServerName https-subsite.mainsite.ru
CustomLog /var/www/httpd-logs/https-subsite.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/https-subsite.mainsite.ru
ErrorLog /var/www/httpd-logs/https-subsite.mainsite.ru.error.log
ServerAdmin webmaster@https-subsite.mainsite.ru
ServerAlias www.https-subsite.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php
php_admin_value open_basedir "/var/www/blah/data:.:/usr/share/pear:/usr/share/php"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName https-subsite.mainsite.ru
CustomLog /var/www/httpd-logs/https-subsite.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/https-subsite.mainsite.ru
ErrorLog /var/www/httpd-logs/https-subsite.mainsite.ru.error.log
ServerAdmin webmaster@https-subsite.mainsite.ru
ServerAlias www.https-subsite.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php
php_admin_value open_basedir "/var/www/blah/data:.:/usr/share/pear:/usr/share/php"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName mainsite.ru
CustomLog /var/www/httpd-logs/mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/mainsite.ru
ErrorLog /var/www/httpd-logs/mainsite.ru.error.log
ServerAdmin webmaster@mainsite.ru
ServerAlias www.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@mainsite.ru"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName othernonhttps.ru
CustomLog /var/www/httpd-logs/othernonhttps.ru.access.log combined
DocumentRoot /var/www/blah/data/www/othernonhttps.ru
ErrorLog /var/www/httpd-logs/othernonhttps.ru.error.log
ServerAdmin webmaster@othernonhttps.ru
ServerAlias www.othernonhttps.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@othernonhttps.ru"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
<VirtualHost *:80 >
ServerName other-non-https.mainsite.ru
CustomLog /var/www/httpd-logs/other-non-https.mainsite.ru.access.log combined
DocumentRoot /var/www/blah/data/www/other-non-https.mainsite.ru
ErrorLog /var/www/httpd-logs/other-non-https.mainsite.ru.error.log
ServerAdmin webmaster@other-non-https.mainsite.ru
ServerAlias www.other-non-https.mainsite.ru
SuexecUserGroup blah blah
AddType application/x-httpd-php .php .php3 .php4 .php5 .phtml
AddType application/x-httpd-php-source .phps
php_admin_value open_basedir "/var/www/blah/data:."
php_admin_value sendmail_path "/usr/sbin/sendmail -t -i -f webmaster@other-non-https.mainsite.ru"
php_admin_value upload_tmp_dir "/var/www/blah/data/mod-tmp"
php_admin_value session.save_path "/var/www/blah/data/mod-tmp"
</VirtualHost>
1 ответ
Мы крутимся в кругах в ветке комментариев выше, поэтому позвольте мне четко изложить это для вас в форме ответа: как только ваши пользователи ввели URL-адрес HTTPS в своем браузере, они обязуются выполнять транзакцию HTTPS с сервером. у которого есть правильно подписанный сертификат, соответствующий имени хоста, который они ввели, прежде чем они смогут вообще что-либо делать. Все, что с этим не так - нет прослушивателя на порту 443, неверное имя хоста в сертификате, срок действия сертификата истек или самозаверяющий - вызовет ошибку для пользователя. Эти ошибки возникают при первом установлении HTTPS-соединения задолго до того, как сервер сможет передать инструкции по перенаправлению. Все должно быть так, иначе HTTPS будет совершенно бессмысленным.
Вы не говорите это явно, но я предполагаю, что у вас есть только один IP-адрес. Идеальным примером для вас является SNI в сочетании с действительными, публично подписанными сертификатами для каждого хоста, размещенного таким образом. Все, что меньше этого, создаст проблемы для ваших пользователей, и ваш единственный выбор - какие проблемы он создаст.
Если вы не возражаете против того, чтобы пользователям приходилось нажимать на предупреждения о самозаверяющих сертификатах, лучше всего подойдет SNI в сочетании с самозаверяющими сертификатами для всех ваших хостов, кроме того, который имеет общедоступный сертификат.
Если ничего из вышеперечисленного не является приемлемым, пожалуйста, уточните, какие ошибки ваши пользователи готовы допустить. И позвольте мне закончить, повторив в последний раз: если вы не готовы получать публичные подписанные сертификаты для всех ваших виртуальных сайтов, поддерживать SNI и требовать поддержки SNI от своих пользователей, вы не сможете сделать это, если ваши пользователи не испытывают какой-либо ошибка