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.comke www.foo.comkecuali jika wwwtidak 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_httpdan 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/subseperti yang didefinisikan oleh VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
mundur:
Yang pertama RewriteRulemenangani domain yang tidak dikenal, misalnya. domain.comdirektori tidak ada, dengan mem-proxy situs web localhost.
Kedua RewriteRuleproxy juga ke localhost ketika kedua domain.com/subdan domain.com/wwwdirektori yang tidak hadir.
RewriteRuleProxy ketiga domain.comsaat domain.com/subtidak ada. Kita tahu domain.com/wwwada karena blok penulisan ulang kedua.
bare.domain
Bare.domain vhost menerima *.*permintaan dan melayani mereka/domain.com/www
Di sini RewriteRuleproksi akan ke localhost ketika domain.comatau domain.com/wwwtidak ada.
^ $%. * !!!
Saya mengalami kesulitan membungkus kepala saya di sekitar semua itu $dan %tanda - tanda di RewriteConddan RewriteRulejadi 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 ServerAliashanya wildcard.
- Di
%ndalam VirtualDocumentRootberasal dari interpolasi nama dokumen .
- The
%nin the second RewriteCondmerujuk pada pilihan (.*)dari yang pertama RewriteCond, mis. bagian dari domain yang diminta.
- The
%ndalam RewriteRulemelakukan terlalu.
- The
$1dalam RewriteRulemengacu 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.