Saya ingin mengatur lingkungan tempat host virtual Apache dapat dibuat secara dinamis tanpa memuat ulang konfigurasi.
Saya dapat melakukan ini dengan mod_vhost_alias , saya mengatur virtual host default saya seperti ini
<VirtualHost *>
UseCanonicalName Off
VirtualDocumentRoot /var/www/sandboxes/domains/%0
ServerName catchall.host
</VirtualHost>
Itu berfungsi dengan baik, tetapi jika permintaan dibuat untuk nama host yang saat ini tidak diatur, saya mendapatkan kesalahan 404 Tidak Ditemukan.
Apa yang saya benar - benar ingin lakukan adalah hanya memiliki tendangan VirtualHost ini hanya jika root dokumen ada, jika tidak cobalah untuk mencocokkan vhost lain (dengan kata lain, membuat kehadiran VirtualDocumentRoot bekerja dengan cara yang sama seperti menggunakan ServerAlias)
Saya mencoba membuat ini vhost kedua, dengan vhost pertama hanya menangani semua permintaan, tetapi ini tidak berhasil - permintaan untuk domain di mana VirtualDocumentRoot dikonfigurasi sedang jatuh ke vhost default.
Jadi, bagaimana saya bisa mengkonfigurasi vhost secara dinamis, tetapi dengan fallback ke vhost lain untuk yang belum terkonfigurasi?
sumber
Saya menemukan pertanyaan Anda saat Googling. Saya memiliki masalah yang persis sama dan menerapkan perbaikan seperti yang dijelaskan dalam jawaban Paul . Namun, untuk aplikasi web saya yang kompleks, saya tidak senang dengan merutekan semua permintaan melalui satu
notfound.php
.Pada akhirnya, saya berhasil memperbaiki masalah tanpa skrip eksternal, hanya dengan mengedit konfigurasi VirtualHost saya.
Pada awalnya, VirtualHost saya dikonfigurasi seperti ini:
Saya punya URL seperti
client1.domainname.com
,client2.domainname.com
danwhatever.domainname.com
yang diselesaikan ke
/mnt/ramdisk/www/cms-client1-development/
,/mnt/ramdisk/www/cms-client2-development/
dan/mnt/ramdisk/www/cms-whatever-development/
Namun, URL seperti
nonexistent.domainname.com
akan memberi saya 404 karena direktori/mnt/ramdisk/www/cms-nonexistent-development/
tidak ada. Saya ingin subdomain ini menggunakan direktori/mnt/ramdisk/www/cms-default-development/
Saya memperbaikinya dengan menggunakan
ModRewrite
danModProxy
:Apa yang dilakukan adalah: ambil subdomain (bagian sebelumnya
.domainname.com
), masukkan itu ke path (% 1) dan permintaan proxy ke URL default hanya jika direktori tidak ada.Dengan menggunakan proxy, prosesnya transparan dan pengguna berpikir dia mengunjungi http://nonexistent.domainname.com , sementara dia benar-benar melihat konten dari http://default.domainname.com/ .
sumber
Saya juga menemukan pertanyaan ini googling untuk mundur vhost apache2 dinamis dan jawaban Luc banyak membantu saya dengan memecahkan masalah saya, tetapi saya masih ingin menunjukkan apa yang saya lakukan untuk mencapai tujuan saya, terutama karena itu melibatkan beberapa pekerjaan tambahan dan karena saya pikir itu dapat bermanfaat untuk semua googler masa depan ...
Tujuan saya
foo.com
harus menyajikan konten yang sama denganwww.foo.com
foo.com
kewww.foo.com
kecuali jikawww
tidak tersedia, fallback ke default sebagai gantinyaDNS
Saya memiliki beberapa domain (dan semua subdomain mereka) yang menunjuk ke VPS saya, misalnya:
Berkas sistem
Saya memiliki direktori berikut, domain berisi direktori dengan nama-nama subdomain yang tersedia, direktori www diperlukan, tetapi konfigurasi harus dapat menangani situasi di mana itu tidak ada. Localhost digunakan sebagai fallback default:
Tes
Menerjemahkan tujuan saya ke dalam kasus yang dapat diuji:
Solusinya
Kegunaan ini:
mod_rewrite
,mod_proxy_http
dan ofcoursemod_vhost_alias
.Bagaimana cara kerjanya? Ada tiga host virtual yang didefinisikan:
localhost
Localhost berfungsi sebagai default. Semua permintaan yang tidak dapat diselesaikan dilayani oleh localhost. Menyiapkan symlink dari localhost ke salah satu domain Anda seperti mengatur situs itu sebagai default.
sub.domain
Sub.domain vhost menerima semua permintaan dalam bentuk
*.*.*
. Secara default semua permintaan dilayani dari/domain.com/sub
seperti yang didefinisikan olehVirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
.mundur:
Yang pertama
RewriteRule
menangani domain yang tidak dikenal, misalnya.domain.com
direktori tidak ada, dengan mem-proxy situs web localhost.Kedua
RewriteRule
proxy juga ke localhost ketika keduadomain.com/sub
dandomain.com/www
direktori yang tidak hadir.RewriteRule
Proxy ketigadomain.com
saatdomain.com/sub
tidak ada. Kita tahudomain.com/www
ada karena blok penulisan ulang kedua.bare.domain
Bare.domain vhost menerima
*.*
permintaan dan melayani mereka/domain.com/www
Di sini
RewriteRule
proksi akan ke localhost ketikadomain.com
ataudomain.com/www
tidak ada.^ $%. * !!!
Saya mengalami kesulitan membungkus kepala saya di sekitar semua itu
$
dan%
tanda - tanda diRewriteCond
danRewriteRule
jadi saya akan menjelaskan tentang mereka di sini:*
dalamServerAlias
hanya wildcard.%n
dalamVirtualDocumentRoot
berasal dari interpolasi nama dokumen .%n
in the secondRewriteCond
merujuk pada pilihan(.*)
dari yang pertamaRewriteCond
, mis. bagian dari domain yang diminta.%n
dalamRewriteRule
melakukan terlalu.$1
dalamRewriteRule
mengacu pada seleksi(.*)
di awalRewriteRule
. Yang menangkap semuanya dari domain hingga?
di url permintaan. Pertanyaan apa pun secara otomatis ditambahkan ke url olehmod_proxy
.sumber
Hanya membuangnya di sana, saya mendapatkan hasil yang sama (minus redirect localhost) seperti RemyNL, tetapi juga termasuk alamat IP saat menghubungkan langsung:
sumber