Служите 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 нет этой проблемы, вы можете сказать, какие директивы listen относятся к SSL; одна из многих причин, почему я люблю это).

Я управляю этим в Apache, чтобы поместить всю мою конфигурацию, не связанную с SSL, в отдельный файл, а затем настроить два виртуальных хоста рядом друг с другом, каждый из которых включает в себя специфический для сайта файл конфигурации внутри раздела 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 Software, и это, кажется, из-за по умолчанию UseCanonicalPhysicalPort Off. Если вы включите это, вы, кажется, получите фактический используемый порт. (Как ни странно, мне пришлось отказаться от SSLEngine Onсвоего дважды использованного виртуального хоста и получить порт 80 по умолчанию.)
Ульрих Шварц

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