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 [email protected]
    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 [email protected]
    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 [email protected]
    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 [email protected]"
    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 [email protected]
    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 [email protected]"
    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 [email protected]
    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 [email protected]"
    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 от своих пользователей, вы не сможете сделать это, если ваши пользователи не испытывают какой-либо ошибка

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