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
- vhosting dinamis untuk semua domain dan subdomain yang menunjuk ke VPS saya
foo.com
harus menyajikan konten yang sama dengan www.foo.com
- fallback untuk domain yang tidak dikenal ke semacam default
- fallback untuk subdomain yang tidak dikenal
foo.com
ke www.foo.com
kecuali jika www
tidak tersedia, fallback ke default sebagai gantinya
DNS
Saya memiliki beberapa domain (dan semua subdomain mereka) yang menunjuk ke VPS saya, misalnya:
- foo.com
- bar.com
- foobar.com
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:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Tes
Menerjemahkan tujuan saya ke dalam kasus yang dapat diuji:
- foo.com harus dilayani dari foo.com/www
- www.foo.com harus dilayani dari foo.com/www
- bar.foo.com harus dilayani dari foo.com/bar
- foo.foo.com harus dilayani dari foo.com/www (foo.com/foo tidak ada)
- bar.com harus dilayani dari localhost (bar.com/www tidak ada)
- www.bar.com harus dilayani dari localhost (bar.com/www tidak ada)
- foo.bar.com harus dilayani dari bar.com/foo
- bar.bar.com harus dilayani dari localhost (bar.com/bar tidak ada)
- foobar.com harus dilayani dari localhost (foobar.com tidak ada)
- www.foobar.com harus dilayani dari localhost (foobar.com tidak ada)
- foo.foobar.com harus dilayani dari localhost (foobar.com tidak ada)
Solusinya
Kegunaan ini: mod_rewrite
, mod_proxy_http
dan ofcourse mod_vhost_alias
.
ServerName my.domain
ServerAdmin admin@my.domain
<VirtualHost *:80>
ServerName localhost
VirtualDocumentRoot /var/www/localhost
</VirtualHost>
<VirtualHost *:80>
ServerName sub.domain
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3 !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteCond /var/www/%2.%3/www !-d
RewriteRule (.*) http://localhost/$1 [P]
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
</VirtualHost>
<VirtualHost *:80>
ServerName bare.domain
ServerAlias *.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/www
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)$ [NC]
RewriteCond /var/www/%1.%2 !-d [OR]
RewriteCond /var/www/%1.%2/www !-d
RewriteRule (.*) http://localhost/$1 [P]
</VirtualHost>
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 oleh VirtualDocumentRoot /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 kedua domain.com/sub
dan domain.com/www
direktori yang tidak hadir.
RewriteRule
Proxy ketiga domain.com
saat domain.com/sub
tidak ada. Kita tahu domain.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 ketika domain.com
atau domain.com/www
tidak ada.
^ $%. * !!!
Saya mengalami kesulitan membungkus kepala saya di sekitar semua itu $
dan %
tanda - tanda di RewriteCond
dan RewriteRule
jadi saya akan menjelaskan tentang mereka di sini:
ServerAlias *.*.*
VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3
RewriteCond %{HTTP_HOST} ^(.*)\.(.*)\.(.*)$ [NC]
RewriteCond /var/www/%2.%3/%1 !-d
RewriteRule (.*) http://%2.%3/$1 [P]
- Di
*
dalam ServerAlias
hanya wildcard.
- Di
%n
dalam VirtualDocumentRoot
berasal dari interpolasi nama dokumen .
- The
%n
in the second RewriteCond
merujuk pada pilihan (.*)
dari yang pertama RewriteCond
, mis. bagian dari domain yang diminta.
- The
%n
dalam RewriteRule
melakukan terlalu.
- The
$1
dalam RewriteRule
mengacu pada seleksi (.*)
di awal RewriteRule
. Yang menangkap semuanya dari domain hingga ?
di url permintaan. Pertanyaan apa pun secara otomatis ditambahkan ke url oleh mod_proxy
.