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

Обслуживать http (порт 80) и https (порт 443) на одном VirtualHost

Мне нужно настроить мой VirtualHost на Apache для обслуживания как по http, так и по https (с использованием стандартных портов)

Если я включаю SSL Engine (как показано ниже) - я получаю сообщение об ошибке при подключении к порту 80.

Причина в том, что некоторые части сайта должны поддерживать SSL, а другие - нет. Как я могу обслуживать оба http + https на сайте?

Вот мой файл виртуального хоста ....

NameVirtualHost *

<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName mysite.co.uk
        DocumentRoot /var/www/mysite/public
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/mysite/public>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>

     #SSL STUFF...
      SSLEngine on
      SSLCertificateFile /etc/apache2/crts/mysite.crt
      SSLCertificateKeyFile /etc/apache2/crts/mysite.key
      SSLCertificateChainFile /etc/apache2/crts/DigiCertCA.crt


</VirtualHost>

Вы не можете сделать это на одном виртуальном хосте, потому что Apache должен знать, какой из них будет использовать SSL, а какой нет (примечание: у nginx нет этой проблемы, вы можете указать ему, какие директивы listen относятся к SSL; одна из многих причин, почему мне это нравится).

Способ, которым я управляю в Apache, - это поместить всю мою конфигурацию, не связанную с SSL, в отдельный файл, а затем настроить два vhosts рядом друг с другом, каждый из которых включает файл конфигурации для конкретного сайта внутри раздела vhost, например :

<VirtualHost 192.0.2.12:80>
    Include /etc/apache2/sites/example.com
</VirtualHost>

<VirtualHost 192.0.2.12:443>
    SSLEngine On
    # etc
    Include /etc/apache2/sites/example.com
</VirtualHost>

Это похоже на проблему в Apache vHost, но он выполняет свою работу без необходимости повторять настройку.

SSLCertificateFile /srv/.ssl/self/server.crt
SSLCertificateKeyFile /srv/.ssl/self/server.pem

# REQUIRED
<VirtualHost *:80>
    DocumentRoot /srv/www/badhost
</VirtualHost>

<VirtualHost *:80 *:443>
    SSLEngine On
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /srv/www/example.www
</VirtualHost>