Обслуговуйте http (порт 80) і https (порт 443) на тому ж VirtualHost


29

Мені потрібно налаштувати свій 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>

Відповіді:


44

Ви не можете зробити це в одному віртуальному хості, тому що Apache повинен знати, хто з них буде говорити SSL, а який - ні (sidenote: у nginx немає цієї проблеми, ви можете сказати, які директиви про прослуховування стосуються 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>

7

Це здається проблемою в 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>

Це справді дивно, але існує!
user77376

1
Це спрацювало так добре, як можна було очікувати від такого хитру - майже, але не зовсім! Я виявив, що Apache 2.4.10 встановлює змінну середовища SERVER_PORT на 443 замість того, щоб використовувати порт, на який надходив запит (залежно від 80 або 443). <IMAGINARY_PARAGRAPH_BREAK> Шкода, так як я сподівався використати це, оскільки дуже хотів зберегти один файл на віртуальний хост. <IMAGINARY_PARAGRAPH_BREAK> Крім того, вам знадобиться директива ServerName у верхній частині <VirtualHost>, інакше вона помилятиме запити помилково. Встановіть його на ServerName badhost.bad або щось подібне.
Даніель Бердсмор

1
@DanielBeardsmore: Я щойно тестував це з 2.4.18 з колекцій програмного забезпечення RH, і це, здається, пов’язано з дефолтом UseCanonicalPhysicalPort Off. Якщо ви встановите це на, ви, здається, використовуєте фактичний порт. (Як це не дивно, мені довелося залишити SSLEngine Onв моєму подвійному vhost і отримав порт 80 за замовчуванням.)
Ульріх Шварц

1
@DanielBeardsmore: FWIW, %{HTTPS}також буде встановлено правильно, але %{REQUEST_SCHEME}це не завжди (завжди http). UseCanonicalRequestSchemeХоча я почуваюся нерозумно, якщо подати запит на особливості директиви
Ульріх Шварц
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.