Sajikan http (port 80) dan https (port 443) pada VirtualHost yang sama


29

Saya perlu mengatur VirtualHost saya di Apache untuk melayani di http dan https (menggunakan port standar)

Jika saya mengaktifkan Mesin SSL (seperti di bawah ini) - Saya mendapatkan pesan kesalahan saat di port 80.

Alasannya adalah, sebagian situs harus SSL tetapi bagian lain tidak. Bagaimana saya bisa melayani kedua http + https di situs?

Ini file virtual host saya ....

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>

Jawaban:


44

Anda tidak dapat melakukan ini di satu host virtual, karena Apache perlu tahu yang mana yang akan berbicara SSL dan mana yang tidak (sidenote: nginx tidak memiliki masalah ini, Anda dapat memberitahu itu arahan mendengarkan yang terkait dengan SSL; salah satu dari banyak alasan saya menyukainya).

Cara saya mengelola ini di Apache adalah dengan meletakkan semua konfigurasi non-terkait SSL saya ke file terpisah, dan kemudian memiliki dua vhosts dikonfigurasi di samping satu sama lain, masing-masing termasuk file konfigurasi khusus situs di dalam vhost stanza, seperti ini :

<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

Sepertinya masalah di Apache vHost, tetapi ia melakukan pekerjaan tanpa harus mengulangi konfigurasi.

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>

Itu benar-benar aneh, tetapi ada!
user77376

1
Ini bekerja dengan baik seperti yang Anda harapkan dari lumpur seperti itu - hampir, tetapi tidak cukup! Saya menemukan bahwa Apache 2.4.10 menetapkan variabel lingkungan SERVER_PORT menjadi 443 alih-alih menggunakan port tempat permintaan tersebut (tergantung 80 atau 443). <IMAGINARY_PARAGRAPH_BREAK> Kasihan, karena saya berharap dapat menggunakan ini, karena saya benar-benar ingin menyimpan satu file per host virtual. <IMAGINARY_PARAGRAPH_BREAK> Selain itu, Anda akan memerlukan arahan ServerName di dalam <VirtualHost> atas jika tidak akan menelan permintaan secara tidak sengaja. Atur ke badhost.bad ServerName atau sesuatu.
Daniel Beardsmore

1
@DanielBeardsmore: Saya baru saja menguji ini dengan 2.4.18 dari koleksi Perangkat Lunak RH, dan itu sepertinya disebabkan oleh defaultnya UseCanonicalPhysicalPort Off. Jika Anda mengaktifkannya, Anda sepertinya mendapatkan port aktual yang digunakan. (Lucunya, saya harus mematikan SSLEngine Onvhost yang digunakan dua kali lipat dan mendapatkan port 80 sebagai default.)
Ulrich Schwarz

1
@DanielBeardsmore: FWIW, %{HTTPS}juga akan diatur dengan benar, tetapi %{REQUEST_SCHEME}tidak selalu http. Tapi saya merasa konyol memasukkan permintaan fitur untuk UseCanonicalRequestSchemearahan.
Ulrich Schwarz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.