Tôi cũng bắt gặp câu hỏi này để tìm kiếm apache2 dự phòng vhost động và câu trả lời của Luc đã giúp tôi rất nhiều trong việc giải quyết vấn đề của mình, nhưng tôi vẫn muốn thể hiện những gì tôi đã làm để đạt được mục tiêu của mình, chủ yếu là vì nó liên quan đến một số công việc phụ và vì tôi nghĩ nó có thể hữu ích cho bất kỳ nhân viên nào trong tương lai ...
Mục tiêu của tôi
- vhosting động cho tất cả các tên miền và tên miền phụ trỏ vào VPS của tôi
foo.com nên phục vụ cùng một nội dung như www.foo.com
- dự phòng cho các tên miền không xác định với một số loại mặc định
- dự phòng cho các tên miền phụ chưa biết của
foo.comđể www.foo.comtrừ trường hợp wwwkhông có sẵn, dự phòng để mặc định thay vì
DNS
Tôi có một vài tên miền (và tất cả tên miền phụ của chúng) trỏ vào VPS của tôi, ví dụ:
- foo.com
- thanh.com
- foobar.com
Hệ thống tập tin
Tôi có các thư mục sau, tên miền chứa các thư mục có tên của các tên miền phụ có sẵn, thư mục www là bắt buộc, nhưng cấu hình sẽ có thể xử lý tình huống không có. Localhost được sử dụng làm dự phòng mặc định:
/var
/www
/localhost
/foo.com
/www
/bar
/bar.com
/foo
Xét nghiệm
Chuyển mục tiêu của tôi thành các trường hợp có thể kiểm chứng:
- foo.com nên được phục vụ từ foo.com/www
- www.foo.com nên được phục vụ từ foo.com/www
- bar.foo.com nên được phục vụ từ foo.com/bar
- foo.foo.com nên được phục vụ từ foo.com/www (foo.com/foo không tồn tại)
- bar.com nên được phục vụ từ localhost (bar.com/www không tồn tại)
- www.bar.com phải được phục vụ từ localhost (bar.com/www không tồn tại)
- foo.bar.com nên được phục vụ từ bar.com/foo
- bar.bar.com phải được phục vụ từ localhost (bar.com/bar không tồn tại)
- foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
- www.foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
- foo.foobar.com nên được phục vụ từ localhost (foobar.com không tồn tại)
Giải pháp
Điều này sử dụng : mod_rewrite, mod_proxy_httpvà tất nhiên 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>
Cái này hoạt động ra sao? Có ba máy chủ ảo được xác định:
localhost
Localhost phục vụ như một mặc định. Tất cả các yêu cầu không thể giải quyết được phục vụ bởi localhost. Thiết lập một liên kết tượng trưng từ localhost đến bất kỳ tên miền nào của bạn cũng giống như thiết lập trang web đó làm mặc định.
tên miền phụ
Subhost miền v.d đang lấy tất cả các yêu cầu ở dạng *.*.*. Theo mặc định, tất cả các yêu cầu được phục vụ từ /domain.com/subnhư được xác định bởi VirtualDocumentRoot /var/www/%-2.0.%-1.0/%-3.
dự phòng:
Đầu tiên RewriteRulechăm sóc các tên miền không xác định, ví dụ. domain.comthư mục không tồn tại, bằng cách ủy quyền trang web localhost.
Thứ hai RewriteRulecũng ủy nhiệm cho localhost khi cả thư mục domain.com/subvà domain.com/wwwthư mục không có mặt.
Các RewriteRuleproxy thứ ba domain.comkhi domain.com/subkhông tồn tại. Chúng tôi biết domain.com/wwwcó tồn tại vì khối viết lại thứ hai.
Bare.domain
Các vhost Bare.domain đang lấy các *.*yêu cầu và phục vụ chúng/domain.com/www
Ở đây RewriteRulesẽ proxy cho localhost khi domain.comhoặc domain.com/wwwkhông tồn tại.
^ $%. * !!!
Tôi đã có một số rắc rối quấn quanh đầu tôi tất cả những $và %những dấu hiệu trong RewriteCondvà RewriteRulevì vậy tôi sẽ giải thích về họ ở đây:
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]
- Các
*trong ServerAliaschỉ là ký tự đại diện.
- Các
%ntrong VirtualDocumentRootlà từ nội suy tên tài liệu .
- Cái
%nthứ hai RewriteCondđề cập đến các lựa chọn (.*)từ cái thứ nhất RewriteCond, vd. các phần của miền được yêu cầu.
- Việc
%ntrong RewriteRulequá.
- Các
$1trong RewriteRuleđề cập đến việc lựa chọn (.*)ở đầu RewriteRule. Mà nắm bắt mọi thứ từ tên miền cho đến ?trong url yêu cầu. Bất kỳ chuỗi truy vấn được tự động thêm vào url bởi mod_proxy.