Bisakah saya mendefinisikan HTTP dan HTTPS di VirtualHost yang sama di conf Apache?

13

Saya punya definisi VirtualHost yang cukup besar yang tidak ingin saya duplikat sehingga situs tersebut juga akan berjalan di atas HTTPS.

Inilah yang ingin saya lakukan:

<VirtualHost *>
    ServerName example.com

    <If port=443>
        SSLEngine on
        SSLCertificateFile ...
        SSLCertificateKeyFile ...
        SSLCertificateChainFile ...
    </If>

    (other config)

</VirtualHost>

Apakah ada cara untuk melakukan ini?
Apakah saya kehilangan beberapa metode lain untuk tidak menduplikasi konfigurasi?

Jake
sumber

Jawaban:

12

Versi stabil Apache saat ini (2.2) tidak memiliki fitur itu, tetapi 2.4 memang memiliki arahan IF .

Anda harus membuat dua VirtualHosts untuk saat ini, tetapi Anda dapat mengatur beberapa hal melalui variabel global lingkungan atau apache dan menggunakannya dalam konfigurasi virtualhost Anda (mengatur rootroot misalnya). Dengan cara ini jika Anda ingin mengubahnya Anda dapat melakukannya hanya dengan satu baris modifikasi.

Tentu saja, Anda dapat menggunakan include untuk melakukan sesuatu seperti ini:

<VirtualHost *:80>
        include /etc/apache2/vhost.conf.d/site1
</VirtualHost>

<VirtualHost *:443>
        include /etc/apache2/vhost.conf.d/site1
        include /etc/apache2/vhost.conf.d/site1-ssl
</VirtualHost>

ps: SNI akan utama tahun sebelum adaptasi IPv6. Semua browser mainstream mendukungnya dengan anggapan Anda menggunakan OS yang didukung.

sunting: seperti fooquency melihat Anda tidak dapat menempatkan SSLEngine Aktif ke blok Jika jadi jawaban saya salah.

Tyrael
sumber
8
Mencoba untuk menempatkan SSLEngine Ondalam <If>akan memberikan SSLEngine not allowed here, sehingga penggunaan-kasus disarankan pada awal jawaban ini sayangnya tidak tampak mungkin. Ini tampaknya karena persyaratan bahwa "Hanya arahan yang mendukung konteks direktori dapat digunakan dalam bagian konfigurasi ini." (ref) dan SSLEnginemerupakan server config, virtual host (ref) , tidak direktori.
fooquency
3

Tidak. Anda dapat memindahkan sebagian besar hal ke konfigurasi Global dan mewarisinya di VirtualHost.

Chris S
sumber
1
Sayangnya saya punya beberapa VirtualHosts, masing-masing dengan konfigurasi yang berbeda dan paling perlu untuk bekerja melalui HTTP dan HTTPS.
Jake
1
Tidak membantu seperti jawaban ini, itu satu-satunya jawaban yang benar. Silakan pindah ke server web yang tidak payah. :)
intgr
3

Ini dijawab dalam pertanyaan lain. Gunakan pernyataan Sertakan. Bekerja seperti pesona bagi saya:

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

# Acme Co
<VirtualHost 192.168.56.101:80>
        Include /usr/local/apache2/conf/main-acme.conf
</VirtualHost>

###* SSL
<VirtualHost 192.168.56.101:443>
        Include /usr/local/apache2/conf/main-acme.conf
        SSLEngine On
</VirtualHost>
Kevin Parker
sumber
2

Untuk host virtual SSL, Anda juga harus menggunakan porta ala kedua

<VirtualHost *:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
    Servername def.com
</VirtualHost>

atau Anda harus menggunakan IP terpisah

<VirtualHost 192.168.0.1:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
    Servername def.com
</VirtualHost>

Ada actaully penjelasan yang sangat bagus di dokumentasi Apache SSL http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

Telusuri "Mengapa saya tidak bisa menggunakan SSL dengan host virtual berbasis nama / non-IP?"

Paul S
sumber
2
Waspadai hal ini untuk masa depan, meskipun: en.wikipedia.org/wiki/Server_Name_Indication
mattdm
Ironisnya, pada saat SNI diterima secara luas sehingga dapat digunakan dengan aman untuk sebagian besar situs hosting virtual, IPv6 mungkin sudah cukup umum untuk menjadikannya tidak relevan.
jgoldschrafe
4
@ jgoldschrafe Hai 2010, ini masa depan yang berbicara di sini! Caniuse baru- baru ini menunjukkan browser non-SNI <2% di seluruh dunia. Dari dunia pertama mungkin jauh lebih sedikit. IPv4 masih hidup dan baik-baik saja :)
kubanczyk
2
@kubanczyk Paham aku! :)
jgoldschrafe
@jgoldschrafe Bahkan dengan IPv6 saya masih akan lebih dulu SNI lebih dari menetapkan blok alamat ke satu mesin, karena IP terutama untuk routing dan lebih mudah untuk mengelola cara itu.
Bachsau