Servire http (porta 80) e https (porta 443) sullo stesso VirtualHost


29

Ho bisogno di configurare il mio VirtualHost su Apache per funzionare su http e https (usando le porte standard)

Se abilito il motore SSL (come di seguito), visualizzo un errore sulla porta 80.

Il motivo è che parti del sito devono essere SSL ma altre parti no. Come posso fare per servire sia http + https sul sito?

Ecco il mio file host virtuale ....

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>

Risposte:


44

Non puoi farlo in un host virtuale, perché Apache ha bisogno di sapere chi parlerà SSL e chi no (sidenote: nginx non ha questo problema, puoi dire quali direttive di ascolto si riferiscono a SSL; uno dei tanti motivi per cui lo adoro).

Il modo in cui lo gestisco in Apache consiste nel mettere tutta la mia configurazione non SSL in un file separato e quindi avere i due vhosts configurati uno accanto all'altro, ciascuno incluso il file di configurazione specifico del sito all'interno della stanza del vhost, come questo :

<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

Sembra un problema in Apache vHost, ma fa il lavoro senza dover ripetere la configurazione.

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>

È davvero strano, ma esiste!
user77376

1
Questo ha funzionato bene come ci si potrebbe aspettare da un tale clamore - quasi, ma non del tutto! Ho scoperto che Apache 2.4.10 imposta la variabile d'ambiente SERVER_PORT su 443 invece di usare la porta su cui è arrivata la richiesta (80 o 443 a seconda). <IMAGINARY_PARAGRAPH_BREAK> Peccato, poiché speravo di poterlo usare, poiché volevo davvero mantenere un file per host virtuale. <IMAGINARY_PARAGRAPH_BREAK> Inoltre, avrai bisogno di una direttiva ServerName nella parte superiore <VirtualHost>, altrimenti inghiottirà le richieste per errore. Impostalo su ServerName badhost.bad o qualcosa del genere.
Daniel Beardsmore,

1
@DanielBeardsmore: l'ho appena provato con 2.4.18 dalle raccolte di software RH, e questo sembra essere dovuto al valore predefinito di UseCanonicalPhysicalPort Off. Se lo si imposta su on, sembra che venga utilizzata la porta effettiva. (Stranamente, ho dovuto lasciare fuori SSLEngine Onnel mio vhost doppiamente usato e ho ottenuto la porta 80 come impostazione predefinita.)
Ulrich Schwarz

1
@DanielBeardsmore: FWIW, %{HTTPS}sarà anche impostato correttamente, ma %{REQUEST_SCHEME}non lo è (sempre http). UseCanonicalRequestSchemeTuttavia, mi sentirei stupido a presentare una richiesta di funzionalità per una direttiva.
Ulrich Schwarz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.